config: merge configs
This commit is contained in:
parent
aadb24aa08
commit
14a25e6b58
|
@ -11,5 +11,58 @@ type configTree struct {
|
|||
// Flatten flattens the entire tree down to a single merged Config
|
||||
// structure.
|
||||
func (t *configTree) Flatten() (*Config, error) {
|
||||
// No children is easy: we're already merged!
|
||||
if len(t.Children) == 0 {
|
||||
return t.Config, nil
|
||||
}
|
||||
|
||||
// Depth-first, merge all the children first.
|
||||
childConfigs := make([]*Config, len(t.Children))
|
||||
for i, ct := range t.Children {
|
||||
c, err := ct.Flatten()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
childConfigs[i] = c
|
||||
}
|
||||
|
||||
// Merge all the children in order
|
||||
config := childConfigs[0]
|
||||
childConfigs = childConfigs[1:]
|
||||
for _, config2 := range childConfigs {
|
||||
var err error
|
||||
config, err = mergeConfig(config, config2)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
// Merge the final merged child config with our own
|
||||
return mergeConfig(config, t.Config)
|
||||
}
|
||||
|
||||
func mergeConfig(c1, c2 *Config) (*Config, error) {
|
||||
c := new(Config)
|
||||
|
||||
// Merge variables: Variable merging is quite simple. Set fields in
|
||||
// later set variables override those earlier.
|
||||
c.Variables = c1.Variables
|
||||
for k, v2 := range c2.Variables {
|
||||
v1, ok := c.Variables[k]
|
||||
if ok {
|
||||
if v2.Default == "" {
|
||||
v2.Default = v1.Default
|
||||
}
|
||||
if v2.Description == "" {
|
||||
v2.Description = v1.Description
|
||||
}
|
||||
}
|
||||
|
||||
c.Variables[k] = v2
|
||||
}
|
||||
|
||||
// TODO: merge resources
|
||||
|
||||
return c, nil
|
||||
}
|
||||
|
|
|
@ -80,7 +80,16 @@ func (t *importTree) ConfigTree() (*configTree, error) {
|
|||
Config: config,
|
||||
}
|
||||
|
||||
// TODO: Follow children and load them
|
||||
// Build the config trees for the children
|
||||
result.Children = make([]*configTree, len(t.Children))
|
||||
for i, ct := range t.Children {
|
||||
t, err := ct.ConfigTree()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
result.Children[i] = t
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
|
|
@ -81,6 +81,13 @@ func resourcesStr(rs []Resource) string {
|
|||
func variablesStr(vs map[string]Variable) string {
|
||||
result := ""
|
||||
for k, v := range vs {
|
||||
if v.Default == "" {
|
||||
v.Default = "<>"
|
||||
}
|
||||
if v.Description == "" {
|
||||
v.Description = "<>"
|
||||
}
|
||||
|
||||
result += fmt.Sprintf(
|
||||
"%s\n %s\n %s\n",
|
||||
k,
|
||||
|
@ -105,8 +112,10 @@ foo
|
|||
`
|
||||
|
||||
const importVariablesStr = `
|
||||
bar
|
||||
<>
|
||||
<>
|
||||
foo
|
||||
bar
|
||||
bar
|
||||
bar
|
||||
`
|
||||
|
|
Loading…
Reference in New Issue