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  }