本文整理汇总了Golang中github.com/cloudfoundry-incubator/spiff/yaml.Node类的典型用法代码示例。如果您正苦于以下问题:Golang Node类的具体用法?Golang Node怎么用?Golang Node使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Node类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: simpleMergeCompatibilityCheck
/*
* compatibility issue. A single merge node was always optional
* means: <<: (( merge )) == <<: (( merge || nil ))
* the first pass, just parses the dynaml
* only the second pass, evaluates a dynaml node!
*/
func simpleMergeCompatibilityCheck(initial bool, node yaml.Node) bool {
if !initial {
merge, ok := node.Value().(dynaml.MergeExpr)
return ok && !merge.Required
}
return false
}
示例2: isExpression
func isExpression(node yaml.Node) bool {
if node == nil {
return false
}
_, ok := node.Value().(Expression)
return ok
}
示例3: ProcessKeyTag
func ProcessKeyTag(val yaml.Node) (yaml.Node, string) {
keyName := ""
m, ok := val.Value().(map[string]yaml.Node)
if ok {
found := false
for key, _ := range m {
split := strings.Index(key, ":")
if split > 0 {
if key[:split] == "key" {
keyName = key[split+1:]
found = true
}
}
}
if found {
newMap := make(map[string]yaml.Node)
for key, v := range m {
split := strings.Index(key, ":")
if split > 0 {
if key[:split] == "key" {
key = key[split+1:]
}
}
newMap[key] = v
}
return yaml.SubstituteNode(newMap, val), keyName
}
}
return val, keyName
}
示例4: flow
func flow(root yaml.Node, env Environment, shouldOverride bool) yaml.Node {
if root == nil {
return root
}
switch val := root.Value().(type) {
case map[string]yaml.Node:
return flowMap(root, env)
case []yaml.Node:
return flowList(root, env)
case dynaml.Expression:
result, ok := val.Evaluate(env)
if !ok {
return root
}
return result
}
if shouldOverride {
overridden, found := env.FindInStubs(env.Path)
if found {
return overridden
}
}
_, ok := root.Value().(string)
if ok {
return flowString(root, env)
}
return root
}
示例5: flowMap
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())
}
示例6: flowList
func flowList(root yaml.Node, env Environment) yaml.Node {
rootList := root.Value().([]yaml.Node)
debug.Debug("HANDLE LIST %v\n", env.Path)
merged, process, replaced, redirectPath, keyName := processMerges(root, rootList, env)
if process {
newList := []yaml.Node{}
if len(redirectPath) > 0 {
env = env.RedirectOverwrite(redirectPath)
}
for idx, val := range merged {
step := stepName(idx, val, keyName)
debug.Debug(" step %s\n", step)
newList = append(newList, flow(val, env.WithPath(step), false))
}
merged = newList
}
if keyName != "" {
root = yaml.KeyNameNode(root, keyName)
}
debug.Debug("LIST DONE (%s)%v\n", root.KeyName(), env.Path)
if replaced {
return yaml.ReplaceNode(merged, root, redirectPath)
}
if len(redirectPath) > 0 {
return yaml.RedirectNode(merged, root, redirectPath)
}
return yaml.SubstituteNode(merged, root)
}
示例7: flowMap
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())
}
示例8: isResolved
func isResolved(node yaml.Node) bool {
if node == nil {
return true
}
switch node.Value().(type) {
case Expression:
return false
case []yaml.Node:
for _, n := range node.Value().([]yaml.Node) {
if !isResolved(n) {
return false
}
}
return true
case map[string]yaml.Node:
for _, n := range node.Value().(map[string]yaml.Node) {
if !isResolved(n) {
return false
}
}
return true
case string:
if yaml.EmbeddedDynaml(node) != nil {
return false
}
return true
default:
return true
}
}
示例9: FindUnresolvedNodes
func FindUnresolvedNodes(root yaml.Node, context ...string) (nodes []UnresolvedNode) {
if root == nil {
return nodes
}
switch val := root.Value().(type) {
case map[string]yaml.Node:
for key, val := range val {
nodes = append(
nodes,
FindUnresolvedNodes(val, addContext(context, key)...)...,
)
}
case []yaml.Node:
for i, val := range val {
context := addContext(context, fmt.Sprintf("[%d]", i))
nodes = append(
nodes,
FindUnresolvedNodes(val, context...)...,
)
}
case Expression:
var path []string
switch val := root.Value().(type) {
case AutoExpr:
path = val.Path
case MergeExpr:
path = val.Path
}
nodes = append(nodes, UnresolvedNode{
Node: root,
Context: context,
Path: path,
})
case string:
if yaml.EmbeddedDynaml(root) != nil {
nodes = append(nodes, UnresolvedNode{
Node: yaml.IssueNode(root, "unparseable expression"),
Context: context,
Path: []string{},
})
}
}
return nodes
}
示例10: flowList
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())
}
示例11: flowString
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())
}
示例12: findUnresolvedNodes
func findUnresolvedNodes(root yaml.Node, context ...string) (nodes []UnresolvedNode) {
if root == nil {
return nodes
}
switch val := root.Value().(type) {
case map[string]yaml.Node:
for key, val := range val {
nodes = append(
nodes,
findUnresolvedNodes(val, addContext(context, key)...)...,
)
}
case []yaml.Node:
for i, val := range val {
context := addContext(context, fmt.Sprintf("[%d]", i))
nodes = append(
nodes,
findUnresolvedNodes(val, context...)...,
)
}
case dynaml.Expression:
nodes = append(nodes, UnresolvedNode{
Node: root,
Context: context,
})
}
return nodes
}
示例13: compare
func compare(a, b yaml.Node, path []string) []Diff {
mismatch := Diff{A: a, B: b, Path: path}
switch av := a.Value().(type) {
case map[string]yaml.Node:
switch bv := b.Value().(type) {
case map[string]yaml.Node:
return compareMap(av, bv, path)
case []yaml.Node:
toMap := listToMap(bv)
if toMap != nil {
return compareMap(av, toMap, path)
} else {
return []Diff{mismatch}
}
default:
return []Diff{mismatch}
}
case []yaml.Node:
switch bv := b.Value().(type) {
case []yaml.Node:
return compareList(av, bv, path)
default:
return []Diff{mismatch}
}
default:
atype := reflect.TypeOf(a)
btype := reflect.TypeOf(b)
if atype != btype {
return []Diff{mismatch}
}
if av != b.Value() {
return []Diff{Diff{A: a, B: b, Path: path}}
}
}
return []Diff{}
}
示例14: processMerges
func processMerges(orig yaml.Node, root []yaml.Node, env Environment) ([]yaml.Node, bool, bool, []string, string) {
spliced := []yaml.Node{}
process := true
keyName := orig.KeyName()
replaced := orig.ReplaceFlag()
redirectPath := orig.RedirectPath()
for _, val := range root {
if val == nil {
continue
}
inlineNode, ok := yaml.UnresolvedListEntryMerge(val)
if ok {
debug.Debug("*** %+v\n", inlineNode.Value())
_, initial := inlineNode.Value().(string)
result := flow(inlineNode, env, false)
if result.KeyName() != "" {
keyName = result.KeyName()
}
debug.Debug("=== (%s)%+v\n", keyName, result)
_, ok := result.Value().(dynaml.Expression)
if ok {
if simpleMergeCompatibilityCheck(initial, inlineNode) {
continue
}
newMap := make(map[string]yaml.Node)
newMap["<<"] = result
val = yaml.SubstituteNode(newMap, orig)
process = false
} else {
inline, ok := result.Value().([]yaml.Node)
if ok {
inlineNew := newEntries(inline, root, keyName)
replaced = result.ReplaceFlag()
redirectPath = result.RedirectPath()
if replaced {
spliced = inlineNew
process = false
break
} else {
spliced = append(spliced, inlineNew...)
}
}
continue
}
}
val, newKey := ProcessKeyTag(val)
if newKey != "" {
keyName = newKey
}
spliced = append(spliced, val)
}
debug.Debug("--> %+v proc=%v replaced=%v redirect=%v key=%s\n", spliced, process, replaced, redirectPath, keyName)
return spliced, process, replaced, redirectPath, keyName
}
示例15: isLocallyResolved
func isLocallyResolved(node yaml.Node) bool {
switch v := node.Value().(type) {
case Expression:
return false
case map[string]yaml.Node:
if !yaml.IsMapResolved(v) {
return false
}
case []yaml.Node:
if !yaml.IsListResolved(v) {
return false
}
default:
}
return true
}