From a321bfe7b2f6db5078de7b2e5ed5ddcccd65f319 Mon Sep 17 00:00:00 2001 From: NeonXP Date: Wed, 16 Nov 2022 05:11:19 +0300 Subject: initial commit --- model/map.go | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 model/map.go (limited to 'model/map.go') 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 +} -- cgit v1.2.3