Utility methods

This commit is contained in:
NeonXP 2022-11-16 21:35:48 +03:00
parent c730afe0f8
commit eb26d597c6
No known key found for this signature in database
GPG key ID: B0DA6283C40CB2CB
5 changed files with 119 additions and 0 deletions

View file

@ -62,4 +62,19 @@ func (n *Node) Value() any
// MarshalJSON to []byte
func (n *Node) MarshalJSON() ([]byte, error)
// Merge two object or array nodes
func (n *Node) Merge(node *Node) error
// Len returns length of object or array nodes
func (n *Node) Len() (int, error)
// Compare current node with another node
func (n *Node) Compare(op Operand, node *Node) bool
// Remove by key from object
func (n *Node) Remove(key string) error
// RemoveIndex from array
func (n *Node) RemoveIndex(idx int) error
```

View file

@ -30,3 +30,13 @@ func (n *Node) Each(cb func(idx int, value *Node) error) error {
}
return nil
}
// RemoveIndex from array
func (n *Node) RemoveIndex(idx int) error {
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:]...)
return nil
}

55
model/condition.go Normal file
View file

@ -0,0 +1,55 @@
package model
// Compare current node with another node
func (n *Node) Compare(op Operand, node *Node) bool {
switch op {
case OpEq:
return n.Value() == node.Value()
case OpNeq:
return n.Value() != node.Value()
case OpLess:
return less(n, node)
case OpGt:
return less(node, n)
case OpLessEq:
return less(n, node) || n.Value() == node.Value()
case OpGtEq:
return less(node, n) || n.Value() == node.Value()
case OpIn:
if n.Type != ArrayNode {
return false
}
for _, v := range n.arrayValue {
if v.Value() == node.Value() {
return true
}
}
}
return false
}
func less(n1 *Node, n2 *Node) bool {
if n1.Type != n2.Type {
return false
}
switch n1.Type {
case NumberNode:
return n1.numberValue < n2.numberValue
case StringNode:
return n1.stringValue < n2.stringValue
default:
return false
}
}
type Operand int
const (
OpEq Operand = iota
OpNeq
OpLess
OpLessEq
OpGt
OpGtEq
OpIn
)

View file

@ -41,3 +41,12 @@ func (n *Node) Map(cb func(key string, value *Node) (*Node, error)) error {
}
return nil
}
// Remove by key from object
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)
return nil
}

View file

@ -113,3 +113,33 @@ func (n *Node) MarshalJSON() ([]byte, error) {
return []byte("null"), nil
}
}
// Merge two object or array nodes
func (n *Node) Merge(node *Node) error {
if n.Type != node.Type {
return fmt.Errorf("can't merge nodes of different types")
}
switch n.Type {
case ObjectNode:
for k, v := range node.objectValue {
n.objectValue[k] = v
}
case ArrayNode:
n.arrayValue = append(n.arrayValue, node.arrayValue...)
default:
return fmt.Errorf("merge not implemented for type %s", n.Type)
}
return nil
}
// Len returns length of object or array nodes
func (n *Node) Len() (int, error) {
switch n.Type {
case ObjectNode:
return len(n.objectValue), nil
case ArrayNode:
return len(n.arrayValue), nil
default:
return 0, fmt.Errorf("merge not implemented for type %s", n.Type)
}
}