Utility methods
This commit is contained in:
parent
c730afe0f8
commit
eb26d597c6
5 changed files with 119 additions and 0 deletions
15
README.md
15
README.md
|
@ -62,4 +62,19 @@ func (n *Node) Value() any
|
||||||
|
|
||||||
// MarshalJSON to []byte
|
// MarshalJSON to []byte
|
||||||
func (n *Node) MarshalJSON() ([]byte, error)
|
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
|
||||||
```
|
```
|
||||||
|
|
|
@ -30,3 +30,13 @@ func (n *Node) Each(cb func(idx int, value *Node) error) error {
|
||||||
}
|
}
|
||||||
return nil
|
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
55
model/condition.go
Normal 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
|
||||||
|
)
|
|
@ -41,3 +41,12 @@ func (n *Node) Map(cb func(key string, value *Node) (*Node, error)) error {
|
||||||
}
|
}
|
||||||
return nil
|
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
|
||||||
|
}
|
||||||
|
|
|
@ -113,3 +113,33 @@ func (n *Node) MarshalJSON() ([]byte, error) {
|
||||||
return []byte("null"), nil
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue