Some fixes

This commit is contained in:
NeonXP 2022-11-21 03:45:23 +03:00
parent 59e421989e
commit 4934a51c69
No known key found for this signature in database
GPG key ID: B0DA6283C40CB2CB
5 changed files with 53 additions and 47 deletions

View file

@ -4,26 +4,26 @@ import "fmt"
// Index returns node by index from array
func (n *Node) Index(idx int) (*Node, error) {
arrlen := len(n.arrayValue)
arrlen := len(n.ArrayValue)
if idx >= arrlen {
return nil, fmt.Errorf("index %d out of range (len=%d)", idx, arrlen)
}
return n.arrayValue[idx], nil
return n.ArrayValue[idx], nil
}
// SetIndex sets node to array by index
func (n *Node) SetIndex(idx int, value *Node) error {
arrlen := len(n.arrayValue)
arrlen := len(n.ArrayValue)
if idx >= arrlen {
return fmt.Errorf("index %d out of range (len=%d)", idx, arrlen)
}
n.arrayValue[idx] = value
n.ArrayValue[idx] = value
return nil
}
// Each applies callback to each element of array
func (n *Node) Each(cb func(idx int, value *Node) error) error {
for i, v := range n.arrayValue {
for i, v := range n.ArrayValue {
if err := cb(i, v); err != nil {
return err
}
@ -33,10 +33,10 @@ func (n *Node) Each(cb func(idx int, value *Node) error) error {
// RemoveIndex from array
func (n *Node) RemoveIndex(idx int) error {
arrlen := len(n.arrayValue)
arrlen := len(n.ArrayValue)
if idx >= arrlen {
return fmt.Errorf("index %d out of range (len=%d)", idx, arrlen)
}
n.arrayValue = append(n.arrayValue[:idx], n.arrayValue[idx:]...)
n.ArrayValue = append(n.ArrayValue[:idx], n.ArrayValue[idx:]...)
return nil
}

View file

@ -19,7 +19,7 @@ func (n *Node) Compare(op Operand, node *Node) bool {
if n.Type != ArrayNode {
return false
}
for _, v := range n.arrayValue {
for _, v := range n.ArrayValue {
if v.Value() == node.Value() {
return true
}
@ -34,9 +34,9 @@ func less(n1 *Node, n2 *Node) bool {
}
switch n1.Type {
case NumberNode:
return n1.numberValue < n2.numberValue
return n1.NumberValue < n2.NumberValue
case StringNode:
return n1.stringValue < n2.stringValue
return n1.StringValue < n2.StringValue
default:
return false
}

View file

@ -10,10 +10,10 @@ 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]
node, ok := n.ObjectValue[key]
if !ok {
keys := make([]string, 0, len(n.objectValue))
for k := range n.objectValue {
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, ", "))
@ -22,22 +22,22 @@ func (n *Node) Get(key string) (*Node, error) {
}
// Set node to object by key
func (n *Node) Set(key string, value *Node) error {
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
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 {
for k, v := range n.ObjectValue {
newNode, err := cb(k, v)
if err != nil {
return err
}
n.objectValue[k] = newNode
n.ObjectValue[k] = newNode
}
return nil
}
@ -47,6 +47,6 @@ func (n *Node) Remove(key string) error {
if n.Type != ObjectNode {
return fmt.Errorf("node must be object, got %s", n.Type)
}
delete(n.objectValue, key)
delete(n.ObjectValue, key)
return nil
}

View file

@ -9,12 +9,12 @@ import (
// Node of JSON tree
type Node struct {
Type NodeType
Meta Meta
stringValue string
numberValue float64
objectValue NodeObjectValue
arrayValue NodeArrayValue
booleanValue bool
Meta NodeObjectValue
StringValue string
NumberValue float64
ObjectValue NodeObjectValue
ArrayValue NodeArrayValue
BooleanValue bool
}
// NewNode creates new node from value
@ -28,15 +28,15 @@ func NewNode(value any) *Node {
func (n *Node) Value() any {
switch n.Type {
case StringNode:
return n.stringValue
return n.StringValue
case NumberNode:
return n.numberValue
return n.NumberValue
case ObjectNode:
return n.objectValue
return n.ObjectValue
case ArrayNode:
return n.arrayValue
return n.ArrayValue
case BooleanNode:
return n.booleanValue
return n.BooleanValue
default:
return nil
}
@ -47,22 +47,27 @@ func (n *Node) SetValue(value any) {
switch value := value.(type) {
case string:
n.Type = StringNode
n.stringValue = value
n.StringValue = value
case float64:
n.Type = NumberNode
n.numberValue = value
n.NumberValue = value
case int:
n.Type = NumberNode
n.numberValue = float64(value)
n.NumberValue = float64(value)
case NodeObjectValue:
n.Type = ObjectNode
n.objectValue = value
meta, hasMeta := value["@"]
if hasMeta {
n.Meta = meta.ObjectValue
delete(value, "@")
}
n.ObjectValue = value
case NodeArrayValue:
n.Type = ArrayNode
n.arrayValue = value
n.ArrayValue = value
case bool:
n.Type = BooleanNode
n.booleanValue = value
n.BooleanValue = value
default:
n.Type = NullNode
}
@ -72,12 +77,12 @@ func (n *Node) SetValue(value any) {
func (n *Node) MarshalJSON() ([]byte, error) {
switch n.Type {
case StringNode:
return []byte(`"` + n.stringValue + `"`), nil
return []byte(`"` + n.StringValue + `"`), nil
case NumberNode:
return []byte(strconv.FormatFloat(n.numberValue, 'g', -1, 64)), nil
return []byte(strconv.FormatFloat(n.NumberValue, 'g', -1, 64)), nil
case ObjectNode:
result := make([][]byte, 0, len(n.objectValue))
for k, v := range n.objectValue {
result := make([][]byte, 0, len(n.ObjectValue))
for k, v := range n.ObjectValue {
b, err := v.MarshalJSON()
if err != nil {
return nil, err
@ -91,8 +96,8 @@ func (n *Node) MarshalJSON() ([]byte, error) {
[]byte("}"),
}, []byte("")), nil
case ArrayNode:
result := make([][]byte, 0, len(n.arrayValue))
for _, v := range n.arrayValue {
result := make([][]byte, 0, len(n.ArrayValue))
for _, v := range n.ArrayValue {
b, err := v.MarshalJSON()
if err != nil {
return nil, err
@ -106,7 +111,7 @@ func (n *Node) MarshalJSON() ([]byte, error) {
[]byte("]"),
}, []byte("")), nil
case BooleanNode:
if n.booleanValue {
if n.BooleanValue {
return []byte("true"), nil
}
return []byte("false"), nil
@ -122,11 +127,11 @@ func (n *Node) Merge(node *Node) error {
}
switch n.Type {
case ObjectNode:
for k, v := range node.objectValue {
n.objectValue[k] = v
for k, v := range node.ObjectValue {
n.ObjectValue[k] = v
}
case ArrayNode:
n.arrayValue = append(n.arrayValue, node.arrayValue...)
n.ArrayValue = append(n.ArrayValue, node.ArrayValue...)
default:
return fmt.Errorf("merge not implemented for type %s", n.Type)
}
@ -137,9 +142,9 @@ func (n *Node) Merge(node *Node) error {
func (n *Node) Len() (int, error) {
switch n.Type {
case ObjectNode:
return len(n.objectValue), nil
return len(n.ObjectValue), nil
case ArrayNode:
return len(n.arrayValue), nil
return len(n.ArrayValue), nil
default:
return 0, fmt.Errorf("merge not implemented for type %s", n.Type)
}

View file

@ -15,6 +15,7 @@ type lexem struct {
End int // End position at input string.
}
//go:generate stringer -type=lexType
type lexType int
const (