aboutsummaryrefslogblamecommitdiff
path: root/model/objectNode.go
blob: 989fd9eebd51dcd57b91ae37fb9e4bdfab5363e2 (plain) (tree)
1
2
3
4
5
6
7
8
9







                        
                             
                            






















                                                                                
















                                                               








                                                        



                                         
package model

import (
	"bytes"
	"fmt"
)

type ObjectNode struct {
	Value NodeObjectValue
	Meta  map[string]any
}

func (n ObjectNode) Type() NodeType {
	return ObjectType
}

func (n *ObjectNode) MarshalJSON() ([]byte, error) {
	result := make([][]byte, 0, len(n.Value))
	for k, v := range n.Value {
		b, err := v.MarshalJSON()
		if err != nil {
			return nil, err
		}
		result = append(result, []byte(fmt.Sprintf("\"%s\": %s", k, b)))
	}
	return bytes.Join(
		[][]byte{
			[]byte("{"),
			bytes.Join(result, []byte(", ")),
			[]byte("}"),
		}, []byte("")), nil
}

func (n *ObjectNode) Get(k string) (Node, error) {
	child, ok := n.Value[k]
	if !ok {
		return nil, fmt.Errorf("field %s not found", k)
	}
	return child, nil
}

func (n *ObjectNode) Merge(n2 *ObjectNode) {
	for k, v := range n2.Value {
		n.Value[k] = v
	}
}

func (n *ObjectNode) Len() int {
	return len(n.Value)
}

func (n *ObjectNode) Set(v any) error {
	val, ok := v.(NodeObjectValue)
	if !ok {
		return fmt.Errorf("%v is not object", v)
	}
	n.Value = val
	return nil
}

func (n *ObjectNode) Remove(key string) {
	delete(n.Value, key)
}