This commit is contained in:
Mike Farah 2019-12-15 17:31:26 +11:00
parent d061b2f9f9
commit b7640946ac

View File

@ -62,7 +62,7 @@ func (n *navigator) Delete(rootNode *yaml.Node, path []string) error {
_, errorVisiting := n.Visit(rootNode, newTail, func(nodeToUpdate *yaml.Node) (*yaml.Node, error) { _, errorVisiting := n.Visit(rootNode, newTail, func(nodeToUpdate *yaml.Node) (*yaml.Node, error) {
n.log.Debug("need to find %v in here", lastBit) n.log.Debug("need to find %v in here", lastBit)
n.DebugNode(nodeToUpdate) n.DebugNode(nodeToUpdate)
original := nodeToUpdate.Content
if nodeToUpdate.Kind == yaml.SequenceNode { if nodeToUpdate.Kind == yaml.SequenceNode {
var index, err = strconv.ParseInt(lastBit, 10, 64) // nolint var index, err = strconv.ParseInt(lastBit, 10, 64) // nolint
if err != nil { if err != nil {
@ -72,11 +72,15 @@ func (n *navigator) Delete(rootNode *yaml.Node, path []string) error {
n.log.Debug("index %v is greater than content lenth %v", index, len(nodeToUpdate.Content)) n.log.Debug("index %v is greater than content lenth %v", index, len(nodeToUpdate.Content))
return nodeToUpdate, nil return nodeToUpdate, nil
} }
original := nodeToUpdate.Content
nodeToUpdate.Content = append(original[:index], original[index+1:]...) nodeToUpdate.Content = append(original[:index], original[index+1:]...)
} else if nodeToUpdate.Kind == yaml.MappingNode { } else if nodeToUpdate.Kind == yaml.MappingNode {
//need to delete both the key and value children from Content
indexInMap := n.findIndexForKeyInMap(nodeToUpdate.Content, lastBit)
if indexInMap != -1 {
//skip two because its a key, value pair
nodeToUpdate.Content = append(original[:indexInMap], original[indexInMap+2:]...)
}
} }
return nodeToUpdate, nil return nodeToUpdate, nil
@ -174,15 +178,14 @@ func (n *navigator) splatMap(value *yaml.Node, tail []string, visitor VisitorFn)
} }
func (n *navigator) recurseMap(value *yaml.Node, head string, tail []string, visitor VisitorFn) (*yaml.Node, error) { func (n *navigator) recurseMap(value *yaml.Node, head string, tail []string, visitor VisitorFn) (*yaml.Node, error) {
for index, content := range value.Content { indexInMap := n.findIndexForKeyInMap(value.Content, head)
// value.Content is a concatenated array of key, value,
// so keys are in the even indexes, values in odd. if indexInMap != -1 {
if index%2 == 1 || (content.Value != head) { value.Content[indexInMap+1] = n.getOrReplace(value.Content[indexInMap+1], n.guessKind(tail, value.Content[indexInMap+1].Kind))
continue return n.Visit(value.Content[indexInMap+1], tail, visitor)
}
value.Content[index+1] = n.getOrReplace(value.Content[index+1], n.guessKind(tail, value.Content[index+1].Kind))
return n.Visit(value.Content[index+1], tail, visitor)
} }
//didn't find it, lets add it.
value.Content = append(value.Content, &yaml.Node{Value: head, Kind: yaml.ScalarNode}) value.Content = append(value.Content, &yaml.Node{Value: head, Kind: yaml.ScalarNode})
mapEntryValue := yaml.Node{Kind: n.guessKind(tail, 0)} mapEntryValue := yaml.Node{Kind: n.guessKind(tail, 0)}
value.Content = append(value.Content, &mapEntryValue) value.Content = append(value.Content, &mapEntryValue)
@ -190,6 +193,18 @@ func (n *navigator) recurseMap(value *yaml.Node, head string, tail []string, vis
return n.Visit(&mapEntryValue, tail, visitor) return n.Visit(&mapEntryValue, tail, visitor)
} }
func (n *navigator) findIndexForKeyInMap(contents []*yaml.Node, key string) int {
for index, content := range contents {
// value.Content is a concatenated array of key, value,
// so keys are in the even indexes, values in odd.
if index%2 == 1 || (content.Value != key) {
continue
}
return index
}
return -1
}
func (n *navigator) splatArray(value *yaml.Node, tail []string, visitor VisitorFn) (*yaml.Node, error) { func (n *navigator) splatArray(value *yaml.Node, tail []string, visitor VisitorFn) (*yaml.Node, error) {
var newNode = yaml.Node{Kind: yaml.SequenceNode, Style: value.Style} var newNode = yaml.Node{Kind: yaml.SequenceNode, Style: value.Style}
newNode.Content = make([]*yaml.Node, len(value.Content)) newNode.Content = make([]*yaml.Node, len(value.Content))