diff options
author | NeonXP <i@neonxp.dev> | 2022-11-16 05:11:19 +0300 |
---|---|---|
committer | NeonXP <i@neonxp.dev> | 2022-11-16 05:11:19 +0300 |
commit | a321bfe7b2f6db5078de7b2e5ed5ddcccd65f319 (patch) | |
tree | d11c187bceee610a7843463949df128569142680 /model/map.go |
initial commit
Diffstat (limited to 'model/map.go')
-rw-r--r-- | model/map.go | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/model/map.go b/model/map.go new file mode 100644 index 0000000..59ba2d8 --- /dev/null +++ b/model/map.go @@ -0,0 +1,43 @@ +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 +} |