diff --git a/examples/data1.yaml b/examples/data1.yaml index 5be86e055a..26c3161c92 100644 --- a/examples/data1.yaml +++ b/examples/data1.yaml @@ -1,11 +1,3 @@ -# block comments come through -person: # neither do comments on maps - name: Mike Wazowski # comments on values appear - pets: - - cat # comments on array values appear - - dog # comments on array values appear - - things: - - frog - food: [pizza] # comments on arrays do not -emptyArray: [] -emptyMap: [] \ No newline at end of file +Foo: 3 +apple: 1 +bar: 2 \ No newline at end of file diff --git a/go.mod b/go.mod index b46d85e999..6733b5f7c8 100644 --- a/go.mod +++ b/go.mod @@ -29,6 +29,4 @@ require ( golang.org/x/sys v0.28.0 // indirect ) -go 1.21.0 - -toolchain go1.22.5 +go 1.23.0 diff --git a/pkg/yqlib/candidate_node.go b/pkg/yqlib/candidate_node.go index 4762ea67d2..093d291df0 100644 --- a/pkg/yqlib/candidate_node.go +++ b/pkg/yqlib/candidate_node.go @@ -198,6 +198,29 @@ func (n *CandidateNode) SetParent(parent *CandidateNode) { n.Parent = parent } +type ValueVisitor func(*CandidateNode) error + +func (n *CandidateNode) VisitValues(visitor ValueVisitor) error { + if n.Kind == MappingNode { + for i := 1; i < len(n.Content); i = i + 2 { + if err := visitor(n.Content[i]); err != nil { + return err + } + } + } else if n.Kind == SequenceNode { + for i := 0; i < len(n.Content); i = i + 1 { + if err := visitor(n.Content[i]); err != nil { + return err + } + } + } + return nil +} + +func (n *CandidateNode) CanVisitValues() bool { + return n.Kind == MappingNode || n.Kind == SequenceNode +} + func (n *CandidateNode) AddKeyValueChild(rawKey *CandidateNode, rawValue *CandidateNode) (*CandidateNode, *CandidateNode) { key := rawKey.Copy() key.SetParent(n) diff --git a/pkg/yqlib/operator_sort.go b/pkg/yqlib/operator_sort.go index 9766742cbf..c76b98469b 100644 --- a/pkg/yqlib/operator_sort.go +++ b/pkg/yqlib/operator_sort.go @@ -26,33 +26,19 @@ func sortByOperator(d *dataTreeNavigator, context Context, expressionNode *Expre var sortableArray sortableNodeArray - if candidate.Kind == MappingNode { - - sortableArray = make(sortableNodeArray, len(candidate.Content)/2) - for i := 1; i < len(candidate.Content); i = i + 2 { - - originalNode := candidate.Content[i] - compareContext, err := d.GetMatchingNodes(context.SingleReadonlyChildContext(originalNode), expressionNode.RHS) + if candidate.CanVisitValues() { + sortableArray = make(sortableNodeArray, 0) + visitor := func(valueNode *CandidateNode) error { + compareContext, err := d.GetMatchingNodes(context.SingleReadonlyChildContext(valueNode), expressionNode.RHS) if err != nil { - return Context{}, err + return err } - - sortableArray[i/2] = sortableNode{Node: originalNode, CompareContext: compareContext, dateTimeLayout: context.GetDateTimeLayout()} - + sortableNode := sortableNode{Node: valueNode, CompareContext: compareContext, dateTimeLayout: context.GetDateTimeLayout()} + sortableArray = append(sortableArray, sortableNode) + return nil } - - } else if candidate.Kind == SequenceNode { - sortableArray = make(sortableNodeArray, len(candidate.Content)) - - for i, originalNode := range candidate.Content { - - compareContext, err := d.GetMatchingNodes(context.SingleReadonlyChildContext(originalNode), expressionNode.RHS) - if err != nil { - return Context{}, err - } - - sortableArray[i] = sortableNode{Node: originalNode, CompareContext: compareContext, dateTimeLayout: context.GetDateTimeLayout()} - + if err := candidate.VisitValues(visitor); err != nil { + return context, err } } else { return context, fmt.Errorf("node at path [%v] is not an array or map (it's a %v)", candidate.GetNicePath(), candidate.Tag)