-
Notifications
You must be signed in to change notification settings - Fork 0
/
generator.go
78 lines (67 loc) · 2.35 KB
/
generator.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package debefix
import "io/fs"
// Generate loads files and calls a resolver callback to resolve the values, and returns the resolved data.
// It is a combination of [Load] and [Resolve].
func Generate(fileProvider FileProvider, resolver ResolveCallback, options ...GenerateOption) (*Data, error) {
return generate(func(g *generator) FileProvider {
return fileProvider
}, resolver, options...)
}
// GenerateFS is a version of [Generate] that loads from a fs.FS.
func GenerateFS(fs fs.FS, resolver ResolveCallback, options ...GenerateOption) (*Data, error) {
return generate(func(g *generator) FileProvider {
return NewFSFileProvider(fs, g.fsFileProviderOption...)
}, resolver, options...)
}
// GenerateDirectory is a version of [Generate] that loads from a directory name.
func GenerateDirectory(rootDir string, resolver ResolveCallback, options ...GenerateOption) (*Data, error) {
return generate(func(g *generator) FileProvider {
return NewDirectoryFileProvider(rootDir, g.fsFileProviderOption...)
}, resolver, options...)
}
func generate(getFileProvider func(g *generator) FileProvider, resolver ResolveCallback, options ...GenerateOption) (*Data, error) {
g := generator{
resolver: resolver,
}
for _, opt := range options {
switch xopt := opt.(type) {
case FSFileProviderOption:
g.fsFileProviderOption = append(g.fsFileProviderOption, xopt)
case LoadOption:
g.loadOptions = append(g.loadOptions, xopt)
case ResolveOption:
g.resolveOptions = append(g.resolveOptions, xopt)
case internalGenerateOption:
xopt.apply(&g)
}
}
g.fileProvider = getFileProvider(&g)
return g.generate()
}
// WithGenerateResolveCheck sets whether to check the data using [ResolveCheck]. Default is false.
func WithGenerateResolveCheck(check bool) GenerateOption {
return fnInternalGenerateOption(func(g *generator) {
g.resolveCheck = check
})
}
type generator struct {
fileProvider FileProvider
resolver ResolveCallback
resolveCheck bool
fsFileProviderOption []FSFileProviderOption
loadOptions []LoadOption
resolveOptions []ResolveOption
}
func (g generator) generate() (*Data, error) {
data, err := Load(g.fileProvider, g.loadOptions...)
if err != nil {
return nil, err
}
if g.resolveCheck {
err = ResolveCheck(data, g.resolveOptions...)
if err != nil {
return nil, err
}
}
return Resolve(data, g.resolver, g.resolveOptions...)
}