44 lines
982 B
Go
44 lines
982 B
Go
package model
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// Get node from object by key
|
|
func (n *Node) Get(key string) (*Node, error) {
|
|
if n.Type != ObjectNode {
|
|
return nil, fmt.Errorf("node must be object, got %s", n.Type)
|
|
}
|
|
node, ok := n.objectValue[key]
|
|
if !ok {
|
|
keys := make([]string, 0, len(n.objectValue))
|
|
for k := range n.objectValue {
|
|
keys = append(keys, k)
|
|
}
|
|
return nil, fmt.Errorf("field '%s' does not exist in object (keys %s)", key, strings.Join(keys, ", "))
|
|
}
|
|
return node, nil
|
|
}
|
|
|
|
// Set node to object by key
|
|
func (n *Node) Set(key string, value *Node) error {
|
|
if n.Type != ObjectNode {
|
|
return fmt.Errorf("node must be object, got %s", n.Type)
|
|
}
|
|
n.objectValue[key] = value
|
|
return nil
|
|
}
|
|
|
|
// Map callback to each key value pair of object
|
|
func (n *Node) Map(cb func(key string, value *Node) (*Node, error)) error {
|
|
for k, v := range n.objectValue {
|
|
newNode, err := cb(k, v)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
n.objectValue[k] = newNode
|
|
}
|
|
return nil
|
|
}
|