mirror of
https://github.com/mikefarah/yq.git
synced 2026-09-05 00:54:51 +08:00
omit operator (#1989)
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
package yqlib
|
||||
|
||||
import (
|
||||
"container/list"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
func omitMap(original *CandidateNode, indices *CandidateNode) *CandidateNode {
|
||||
filteredContent := make([]*CandidateNode, 0, max(0, len(original.Content)-len(indices.Content)*2))
|
||||
|
||||
for index := 0; index < len(original.Content); index += 2 {
|
||||
pos := findInArray(indices, original.Content[index])
|
||||
if pos < 0 {
|
||||
clonedKey := original.Content[index].Copy()
|
||||
clonedValue := original.Content[index+1].Copy()
|
||||
filteredContent = append(filteredContent, clonedKey, clonedValue)
|
||||
}
|
||||
}
|
||||
result := original.CopyWithoutContent()
|
||||
result.AddChildren(filteredContent)
|
||||
return result
|
||||
}
|
||||
|
||||
func omitSequence(original *CandidateNode, indices *CandidateNode) *CandidateNode {
|
||||
filteredContent := make([]*CandidateNode, 0, max(0, len(original.Content)-len(indices.Content)))
|
||||
|
||||
for index := 0; index < len(original.Content); index++ {
|
||||
pos := findInArray(indices, createScalarNode(index, strconv.Itoa(index)))
|
||||
if pos < 0 {
|
||||
filteredContent = append(filteredContent, original.Content[index].Copy())
|
||||
}
|
||||
}
|
||||
result := original.CopyWithoutContent()
|
||||
result.AddChildren(filteredContent)
|
||||
return result
|
||||
}
|
||||
|
||||
func omitOperator(d *dataTreeNavigator, context Context, expressionNode *ExpressionNode) (Context, error) {
|
||||
log.Debugf("Omit")
|
||||
|
||||
contextIndicesToOmit, err := d.GetMatchingNodes(context, expressionNode.RHS)
|
||||
|
||||
if err != nil {
|
||||
return Context{}, err
|
||||
}
|
||||
indicesToOmit := &CandidateNode{}
|
||||
if contextIndicesToOmit.MatchingNodes.Len() > 0 {
|
||||
indicesToOmit = contextIndicesToOmit.MatchingNodes.Front().Value.(*CandidateNode)
|
||||
}
|
||||
if len(indicesToOmit.Content) == 0 {
|
||||
log.Debugf("No omit indices specified")
|
||||
return context, nil
|
||||
}
|
||||
var results = list.New()
|
||||
|
||||
for el := context.MatchingNodes.Front(); el != nil; el = el.Next() {
|
||||
node := el.Value.(*CandidateNode)
|
||||
|
||||
var replacement *CandidateNode
|
||||
|
||||
if node.Kind == MappingNode {
|
||||
replacement = omitMap(node, indicesToOmit)
|
||||
} else if node.Kind == SequenceNode {
|
||||
replacement = omitSequence(node, indicesToOmit)
|
||||
} else {
|
||||
log.Debugf("Omit from type %v (%v) is noop", node.Tag, node.GetNicePath())
|
||||
return context, nil
|
||||
}
|
||||
replacement.LeadingContent = node.LeadingContent
|
||||
results.PushBack(replacement)
|
||||
}
|
||||
return context.ChildContext(results), nil
|
||||
}
|
||||
Reference in New Issue
Block a user