json/model/map.go

53 lines
1.2 KiB
Go
Raw Normal View History

2022-11-16 05:11:19 +03:00
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)
}
2022-11-21 03:45:23 +03:00
node, ok := n.ObjectValue[key]
2022-11-16 05:11:19 +03:00
if !ok {
2022-11-21 03:45:23 +03:00
keys := make([]string, 0, len(n.ObjectValue))
for k := range n.ObjectValue {
2022-11-16 05:11:19 +03:00
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
2022-11-21 03:45:23 +03:00
func (n *Node) Set(key string, value Node) error {
2022-11-16 05:11:19 +03:00
if n.Type != ObjectNode {
return fmt.Errorf("node must be object, got %s", n.Type)
}
2022-11-21 03:45:23 +03:00
n.ObjectValue[key] = &value
2022-11-16 05:11:19 +03:00
return nil
}
// Map callback to each key value pair of object
func (n *Node) Map(cb func(key string, value *Node) (*Node, error)) error {
2022-11-21 03:45:23 +03:00
for k, v := range n.ObjectValue {
2022-11-16 05:11:19 +03:00
newNode, err := cb(k, v)
if err != nil {
return err
}
2022-11-21 03:45:23 +03:00
n.ObjectValue[k] = newNode
2022-11-16 05:11:19 +03:00
}
return nil
}
2022-11-16 21:35:48 +03:00
// 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)
}
2022-11-21 03:45:23 +03:00
delete(n.ObjectValue, key)
2022-11-16 21:35:48 +03:00
return nil
}