aboutsummaryrefslogtreecommitdiff
path: root/model/map.go
diff options
context:
space:
mode:
authorNeonXP <i@neonxp.dev>2022-11-16 05:11:19 +0300
committerNeonXP <i@neonxp.dev>2022-11-16 05:11:19 +0300
commita321bfe7b2f6db5078de7b2e5ed5ddcccd65f319 (patch)
treed11c187bceee610a7843463949df128569142680 /model/map.go
initial commit
Diffstat (limited to 'model/map.go')
-rw-r--r--model/map.go43
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
+}