func flowMap(root yaml.Node, env Environment) yaml.Node { rootMap := root.Value().(map[string]yaml.Node) env = env.WithScope(rootMap) newMap := make(map[string]yaml.Node) for key, val := range rootMap { if key == "<<" { base := flow(val, env, true) baseMap, ok := base.Value().(map[string]yaml.Node) if ok { for k, v := range baseMap { newMap[k] = v } } continue } newMap[key] = flow(val, env.WithPath(key), true) } return yaml.NewNode(newMap, root.SourceName()) }
func flowMap(root yaml.Node, env Environment) yaml.Node { rootMap := root.Value().(map[string]yaml.Node) env = env.WithScope(rootMap) newMap := make(map[string]yaml.Node) sortedKeys := getSortedKeys(rootMap) // iteration order matters for the "<<" operator, it must be the first key in the map that is handled for i := range sortedKeys { key := sortedKeys[i] val := rootMap[key] if key == "<<" { base := flow(val, env, true) baseMap, ok := base.Value().(map[string]yaml.Node) if ok { for k, v := range baseMap { newMap[k] = v } } continue } newMap[key] = flow(val, env.WithPath(key), true) } return yaml.NewNode(newMap, root.SourceName()) }
func flowList(root yaml.Node, env Environment) yaml.Node { rootList := root.Value().([]yaml.Node) merged := processMerges(rootList, env) newList := []yaml.Node{} for idx, val := range merged { step := stepName(idx, val) newList = append(newList, flow(val, env.WithPath(step), false)) } return yaml.NewNode(newList, root.SourceName()) }
func flowString(root yaml.Node, env Environment) yaml.Node { rootString := root.Value().(string) sub := embeddedDynaml.FindStringSubmatch(rootString) if sub == nil { return root } expr, err := dynaml.Parse(sub[1], env.Path) if err != nil { return root } return yaml.NewNode(expr, root.SourceName()) }