generated from TBD54566975/tbd-project-template
-
Notifications
You must be signed in to change notification settings - Fork 5
/
merge.go
63 lines (59 loc) 路 1.34 KB
/
merge.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
package projectconfig
// Merge configuration files.
//
// Config is merged left to right, with later files taking precedence over earlier files.
func Merge(paths ...string) (Config, error) {
config := Config{}
for _, path := range paths {
partial, err := loadFile(path)
if err != nil {
return config, err
}
config = merge(config, partial)
}
return config, nil
}
func merge(a, b Config) Config {
a = mergeRootKeys(a, b)
a.Global = mergeConfigAndSecrets(a.Global, b.Global)
for k, v := range b.Modules {
if a.Modules == nil {
a.Modules = map[string]ConfigAndSecrets{}
}
a.Modules[k] = mergeConfigAndSecrets(a.Modules[k], v)
}
return a
}
func mergeConfigAndSecrets(a, b ConfigAndSecrets) ConfigAndSecrets {
for k, v := range b.Config {
if a.Config == nil {
a.Config = map[string]*URL{}
}
a.Config[k] = v
}
for k, v := range b.Secrets {
if a.Secrets == nil {
a.Secrets = map[string]*URL{}
}
a.Secrets[k] = v
}
return a
}
func mergeRootKeys(a, b Config) Config {
if b.ModuleDirs != nil {
a.ModuleDirs = b.ModuleDirs
}
if b.ExternalDirs != nil {
a.ExternalDirs = b.ExternalDirs
}
if b.Executables.FTL != "" {
a.Executables.FTL = b.Executables.FTL
}
if len(b.Commands.Startup) > 0 {
a.Commands.Startup = b.Commands.Startup
}
if b.FTLMinVersion != "" {
a.FTLMinVersion = b.FTLMinVersion
}
return a
}