Skip to content

Commit 4e929b8

Browse files
committed
pkg/nsrule: Allow operators to be overloaded
1 parent 9a47702 commit 4e929b8

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

pkg/nsrule/env.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,18 @@ package nsrule
22

33
import (
44
"maps"
5+
"reflect"
6+
7+
"github.com/antonmedv/expr"
58
)
69

710
// Env contains data used to evaluate rules.
811
type Env map[string]any
912

1013
var (
11-
dummyEnv = Env{}
12-
defaultEnv = Env{}
14+
dummyEnv = Env{}
15+
defaultEnv = Env{}
16+
extraOptions []expr.Option
1317
)
1418

1519
// NewEnv shallow-copies the default values into a new Env.
@@ -43,3 +47,11 @@ func Define[T any](name string) func(Env, T) {
4347
func DefineDefault[T any](name string, def T) func(Env, T) {
4448
return define[T](name, def, false)
4549
}
50+
51+
// DefineOperator overloads an operator.
52+
func DefineOperator[T any](op string, fn T) string {
53+
name := op + " " + reflect.TypeOf(fn).String()
54+
extraOptions = append(extraOptions, expr.Operator(op, name))
55+
define[T](name, fn, false)
56+
return name
57+
}

pkg/nsrule/rule.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ func ParseRules(r io.Reader, name string) ([]Rule, error) {
171171
name: name,
172172
line: expN,
173173
}
174-
if v, err := expr.Compile(expB.String(), expr.AsBool(), expr.Optimize(true), expr.Env(dummyEnv)); err != nil { // TODO: dummy env
174+
if v, err := expr.Compile(expB.String(), append([]expr.Option{expr.AsBool(), expr.Optimize(true), expr.Env(dummyEnv)}, extraOptions...)...); err != nil { // TODO: dummy env
175175
return rs, fmt.Errorf("line %d: compile rule expression: %w", expN, err)
176176
} else {
177177
r.expr = v

0 commit comments

Comments
 (0)