3
0
corteza/pkg/y7s/each.go
2021-01-25 18:05:24 +01:00

60 lines
1.2 KiB
Go

package y7s
// y7s (YAML Utils)
import (
"gopkg.in/yaml.v3"
)
// eachKV iterates over map node
func EachMap(n *yaml.Node, fn func(*yaml.Node, *yaml.Node) error) error {
if !IsKind(n, yaml.MappingNode) {
// root node kind be mapping
return NodeErr(n, "expecting mapping node")
}
for i := 0; i < len(n.Content); i += 2 {
if err := fn(n.Content[i], n.Content[i+1]); err != nil {
return err
}
}
return nil
}
// eachKV iterates over sequence node
func EachSeq(n *yaml.Node, fn func(*yaml.Node) error) error {
if !IsKind(n, yaml.SequenceNode) {
// root node kind be mapping
return NodeErr(n, "expecting sequence node")
}
for i := 0; i < len(n.Content); i++ {
if err := fn(n.Content[i]); err != nil {
return err
}
}
return nil
}
// each helps iterate over mapping and sequence nodes fairly trivially
func Each(n *yaml.Node, fn func(*yaml.Node, *yaml.Node) error) error {
if IsKind(n, yaml.MappingNode) {
return EachMap(n, fn)
}
if IsKind(n, yaml.SequenceNode) {
var placeholder *yaml.Node
for i := 0; i < len(n.Content); i++ {
if err := fn(placeholder, n.Content[i]); err != nil {
return err
}
}
return nil
}
return NodeErr(n, "expecting mapping or sequence node")
}