Allow setting every array element in replacements

This commit is contained in:
koba1t
2022-01-27 06:17:23 +09:00
parent c65ef489ca
commit 26b9af0379
3 changed files with 44 additions and 0 deletions

View File

@@ -83,10 +83,42 @@ func (p *PathMatcher) filter(rn *RNode) (*RNode, error) {
// match seq elements
return p.doSeq(rn)
}
if IsMatchEveryIndex(p.Path[0]) {
// match every elements (*)
return p.doMatchEvery(rn)
}
// match a field
return p.doField(rn)
}
func (p *PathMatcher) doMatchEvery(rn *RNode) (*RNode, error) {
if err := rn.VisitElements(p.visitEveryElem); err != nil {
return nil, err
}
// fmt.Println(p.val.String())
return p.val, nil
}
func (p *PathMatcher) visitEveryElem(elem *RNode) error {
fieldName := p.Path[0]
// recurse on the matching element
pm := &PathMatcher{Path: p.Path[1:]}
add, err := pm.filter(elem)
for k, v := range pm.Matches {
p.Matches[k] = v
}
if err != nil || add == nil {
return err
}
p.append(fieldName, add.Content()...)
return nil
}
func (p *PathMatcher) doField(rn *RNode) (*RNode, error) {
// lookup the field
field, err := rn.Pipe(Get(p.Path[0]))