60 lines
1.2 KiB
Go
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")
|
|
}
|