-
Notifications
You must be signed in to change notification settings - Fork 34
/
evaluator.go
78 lines (73 loc) · 1.87 KB
/
evaluator.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
72
73
74
75
76
77
78
package criteria
import (
"fmt"
"github.com/viant/assertly"
"github.com/viant/endly"
"github.com/viant/endly/model/criteria/compiler"
"github.com/viant/endly/model/criteria/eval"
"github.com/viant/toolbox/data"
)
// EvalEvent represents criteria event
type EvalEvent struct {
Type string
Default bool
Evaluation bool
Criteria string
Has bool
Error string
}
// NewEvalEvent creates a new evaluation event.
func NewEvalEvent(criteriaType string, defaultValue, evaluation bool, criteria string, has bool, err error) *EvalEvent {
var result = &EvalEvent{
Type: criteriaType,
Default: defaultValue,
Evaluation: evaluation,
Has: has,
Criteria: criteria,
}
if err != nil {
result.Error = fmt.Sprintf("%v", err)
}
return result
}
func Evaluate(context *endly.Context, state data.Map, expression string, compute *eval.Compute, eventType string, defaultValue bool) (bool, error) {
if expression == "" {
return defaultValue, nil
}
var evaluator eval.Compute
if *compute != nil {
evaluator = *compute
}
if evaluator == nil {
cmp, err := compiler.Compile(expression)
if err != nil {
return defaultValue, err
}
evaluator, err = cmp()
if err != nil {
return defaultValue, err
}
}
result, has, err := evaluator(state)
ret, ok := result.(bool)
if !ok {
ret = defaultValue
}
if context != nil {
context.Publish(NewEvalEvent(eventType, defaultValue, ret, expression, true, err))
}
if err != nil {
return defaultValue, err
}
if !has {
return defaultValue, nil
}
return ret, nil
}
// Assert validates expected against actual
func Assert(context *endly.Context, root string, expected, actual interface{}) (*assertly.Validation, error) {
ctx := assertly.NewDefaultContext()
ctx.Context = context.Context
var rootPath = assertly.NewDataPath(root)
return assertly.AssertWithContext(expected, actual, rootPath, ctx)
}