-
Notifications
You must be signed in to change notification settings - Fork 1
/
valuator.go
71 lines (62 loc) · 1.37 KB
/
valuator.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package valuator
import (
"encoding/json"
"errors"
"strings"
)
//Error collections
var (
ErrUnrecognized = errors.New("Valuator for operator is not recognized")
ErrInvalidFormat = errors.New("Expression value is not valid")
)
//Expression of a rule
type expression struct {
inverse bool
property string
operator string
value interface{}
description string
}
//Evaluator expression evaluator
type Evaluator interface {
//Evaluate returns true if expression is valid
Evaluate(obj map[string]interface{}) bool
}
//NewValuator picked based on operator
func NewValuator(prop, op, val, desc string) (Evaluator, error) {
inverse := strings.HasPrefix(op, "!")
if inverse {
runes := []rune(op)
op = string(runes[1:])
}
expr := expression{inverse, prop, op, val, desc}
switch op {
case "=":
return &equality{expr}, nil
case "in":
arr := []interface{}{}
err := json.Unmarshal([]byte(val), &arr)
if err != nil {
return nil, ErrInvalidFormat
}
expr.value = arr
return &in{expr}, nil
case "intersect":
arr := []interface{}{}
err := json.Unmarshal([]byte(val), &arr)
if err != nil {
return nil, ErrInvalidFormat
}
expr.value = arr
return &intersect{expr}, nil
case ">":
return >{expr}, nil
case ">=":
return >e{expr}, nil
case "<":
return <{expr}, nil
case "<=":
return <e{expr}, nil
}
return nil, ErrUnrecognized
}