| skipped 27 lines |
28 | 28 | | return c.programOptions |
29 | 29 | | } |
30 | 30 | | |
31 | | - | // var CustomLibPool = sync.Pool{ |
32 | | - | // New: func() interface{} { |
33 | | - | // return CustomLib{} |
34 | | - | // }, |
35 | | - | // } |
36 | | - | |
37 | 31 | | func (c *CustomLib) Run(expression string, variablemap map[string]interface{}, call runCallback) { |
38 | 32 | | env, err := c.NewCelEnv() |
39 | 33 | | if err != nil { |
| skipped 27 lines |
67 | 61 | | |
68 | 62 | | type runCallback func(interface{}, error) |
69 | 63 | | |
70 | | - | // Step 1: 创建 cel 库 |
71 | 64 | | func NewCustomLib() *CustomLib { |
72 | 65 | | c := &CustomLib{} |
73 | 66 | | reg := types.NewEmptyRegistry() |
| skipped 2 lines |
76 | 69 | | return c |
77 | 70 | | } |
78 | 71 | | |
79 | | - | // Step 2: 创建 cel 环境 |
80 | 72 | | func (c *CustomLib) NewCelEnv() (env *cel.Env, err error) { |
81 | 73 | | env, err = cel.NewEnv(cel.Lib(c)) |
82 | 74 | | return env, err |
83 | 75 | | } |
84 | 76 | | |
85 | | - | // Step 3: 执行表达式 |
86 | | - | // @env cel.Env cel环境 |
87 | | - | // @expression string gocel表达式 |
88 | | - | // @params map[string]interface 表达式变量值 |
89 | 77 | | func Eval(env *cel.Env, expression string, params map[string]interface{}) (ref.Val, error) { |
90 | 78 | | ast, iss := env.Compile(expression) |
91 | 79 | | if iss.Err() != nil { |
| skipped 13 lines |
105 | 93 | | return out, nil |
106 | 94 | | } |
107 | 95 | | |
108 | | - | // 如果有set:追加set变量到 cel options |
109 | | - | // 这里得注意下 reverse的顺序问题 map可能是随机的 |
110 | 96 | | func (c *CustomLib) WriteRuleSetOptions(args yaml.MapSlice) { |
111 | 97 | | for _, v := range args { |
112 | 98 | | key := v.Key.(string) |
113 | 99 | | value := v.Value |
114 | | - | // 在执行之前是不知道变量的类型的,所以统一声明为字符型 |
115 | | - | // 所以randomInt虽然返回的是int型,在运算中却被当作字符型进行计算,需要重载string_*_string |
| 100 | + | |
116 | 101 | | var d *exprpb.Decl |
117 | 102 | | switch vv := value.(type) { |
118 | 103 | | case int64: |
| skipped 44 lines |