github.com/ipld/go-ipld-prime@v0.21.0/traversal/selector/exploreAll.go (about) 1 package selector 2 3 import ( 4 "fmt" 5 6 "github.com/ipld/go-ipld-prime/datamodel" 7 ) 8 9 // ExploreAll is similar to a `*` -- it traverses all elements of an array, 10 // or all entries in a map, and applies a next selector to the reached nodes. 11 type ExploreAll struct { 12 next Selector // selector for element we're interested in 13 } 14 15 // Interests for ExploreAll is nil (meaning traverse everything) 16 func (s ExploreAll) Interests() []datamodel.PathSegment { 17 return nil 18 } 19 20 // Explore returns the node's selector for all fields 21 func (s ExploreAll) Explore(n datamodel.Node, p datamodel.PathSegment) (Selector, error) { 22 return s.next, nil 23 } 24 25 // Decide always returns false because this is not a matcher 26 func (s ExploreAll) Decide(n datamodel.Node) bool { 27 return false 28 } 29 30 // Match always returns false because this is not a matcher 31 func (s ExploreAll) Match(node datamodel.Node) (datamodel.Node, error) { 32 return nil, nil 33 } 34 35 // ParseExploreAll assembles a Selector from a ExploreAll selector node 36 func (pc ParseContext) ParseExploreAll(n datamodel.Node) (Selector, error) { 37 if n.Kind() != datamodel.Kind_Map { 38 return nil, fmt.Errorf("selector spec parse rejected: selector body must be a map") 39 } 40 next, err := n.LookupByString(SelectorKey_Next) 41 if err != nil { 42 return nil, fmt.Errorf("selector spec parse rejected: next field must be present in ExploreAll selector") 43 } 44 selector, err := pc.ParseSelector(next) 45 if err != nil { 46 return nil, err 47 } 48 return ExploreAll{selector}, nil 49 }