json/model/map.go

53 lines
1.2 KiB
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
}
// Remove by key from object
func (n *Node) Remove(key string) error {
if n.Type != ObjectNode {
return fmt.Errorf("node must be object, got %s", n.Type)
}
delete(n.objectValue, key)
return nil
}