diff options
author | NeonXP <i@neonxp.dev> | 2022-11-16 21:35:48 +0300 |
---|---|---|
committer | NeonXP <i@neonxp.dev> | 2022-11-16 21:35:48 +0300 |
commit | eb26d597c6d526f84077afdc141b0a5d585c7da3 (patch) | |
tree | a07e5e4c79e3217afb87877287315bb8590b989f /model/condition.go | |
parent | c730afe0f889587630789c4fa38267d1edf465f2 (diff) |
Utility methodsv0.0.1
Diffstat (limited to 'model/condition.go')
-rw-r--r-- | model/condition.go | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/model/condition.go b/model/condition.go new file mode 100644 index 0000000..0b558b4 --- /dev/null +++ b/model/condition.go @@ -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 +) |