From 93bc6cd3e2d188af14e0ff1f48dbd80944a091fa Mon Sep 17 00:00:00 2001 From: Alex Petraky <petraky@perx.ru> Date: Tue, 1 Apr 2025 10:26:19 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F=20exp?= =?UTF-8?q?r=20=D0=B4=D0=BE=20v1.17.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Issue: #3170 --- go.mod | 2 +- go.sum | 4 ++-- pkg/expr/config.go | 20 ++++++-------------- pkg/expr/expr.go | 4 +--- pkg/expr/format_test.go | 2 +- pkg/expr/mongo.go | 8 +------- 6 files changed, 12 insertions(+), 28 deletions(-) diff --git a/go.mod b/go.mod index 1f94424c..8a493053 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.23.2 require ( github.com/avast/retry-go/v4 v4.6.0 github.com/bep/gowebp v0.4.0 - github.com/expr-lang/expr v1.16.9 + github.com/expr-lang/expr v1.17.2 github.com/go-kit/kit v0.13.0 github.com/gosimple/slug v1.14.0 github.com/hashicorp/go-multierror v1.1.1 diff --git a/go.sum b/go.sum index 4b2f278b..eec324be 100644 --- a/go.sum +++ b/go.sum @@ -10,8 +10,8 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/expr-lang/expr v1.16.9 h1:WUAzmR0JNI9JCiF0/ewwHB1gmcGw5wW7nWt8gc6PpCI= -github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= +github.com/expr-lang/expr v1.17.2 h1:o0A99O/Px+/DTjEnQiodAgOIK9PPxL8DtXhBRKC+Iso= +github.com/expr-lang/expr v1.17.2/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= github.com/go-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU= github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= diff --git a/pkg/expr/config.go b/pkg/expr/config.go index 130342b8..a079d768 100644 --- a/pkg/expr/config.go +++ b/pkg/expr/config.go @@ -37,10 +37,6 @@ func GetDefaultConfig(e map[string]interface{}) *conf.Config { return defaultConfig.GetConfig(e) } -// func GetDefaultEnv(e map[string]interface{}) map[string]interface{} { -// return defaultConfig.GetEnv(e) -// } - func Extend(kv ...interface{}) expr.Option { e := make(map[string]interface{}) i := 0 @@ -62,23 +58,19 @@ func Extend(kv ...interface{}) expr.Option { func ExtendMap(e map[string]interface{}) expr.Option { return func(c *conf.Config) { - var env map[string]interface{} - var ok bool - if c.Env == nil { - env = make(map[string]interface{}) - } else { - if env, ok = c.Env.(map[string]interface{}); !ok { + env := make(map[string]interface{}) + if !c.Env.IsUnknown() { + var ok bool + if env, ok = c.EnvObject.(map[string]interface{}); !ok { panic("only map expr environment is supported") } } + for k, v := range e { if _, ok := env[k]; !ok { env[k] = v } } - c.Strict = true - c.MapEnv = true - c.Env = env - c.Types = conf.CreateTypesTable(c.Env) + c.WithEnv(env) } } diff --git a/pkg/expr/expr.go b/pkg/expr/expr.go index 42588c2b..5c438b60 100644 --- a/pkg/expr/expr.go +++ b/pkg/expr/expr.go @@ -28,14 +28,12 @@ func Eval(ctx context.Context, input string, env map[string]interface{}) (interf e[EnvContextKey] = ctx cfg := GetDefaultConfig(e) - env, _ = cfg.Env.(map[string]interface{}) - program, err := exprcompiler.Compile(tree, cfg) if err != nil { return nil, err } - output, err := vm.Run(program, env) + output, err := vm.Run(program, e) if err != nil { return nil, err } diff --git a/pkg/expr/format_test.go b/pkg/expr/format_test.go index 7a0ba4c6..576a55eb 100644 --- a/pkg/expr/format_test.go +++ b/pkg/expr/format_test.go @@ -19,7 +19,7 @@ func TestFormat(t *testing.T) { }{ {"sprintf#1", "sprintf(s1, s2)", map[string]interface{}{"s1": "hello %s", "s2": "world"}, "hello world"}, {"sprintf#2", "sprintf(s1, s2)", map[string]interface{}{"s1": nil, "s2": nil}, ""}, - {"sprintf#3", "sprintf(s1, s2)", map[string]interface{}{"s1": "hello %s", "s2": nil}, "hello %!s(<nil>)"}, + {"sprintf#3", "sprintf(s1, s2)", map[string]interface{}{"s1": "hello %s", "s2": nil}, "hello []"}, {"to_upper#1", "to_upper(s1)", map[string]interface{}{"s1": "hello"}, "HELLO"}, {"to_upper#2", "to_upper(s1)", map[string]interface{}{"s1": nil}, ""}, {"trim_space#1", "trim_space(s1)", map[string]interface{}{"s1": " hel lo wor ld "}, "hel lo wor ld"}, diff --git a/pkg/expr/mongo.go b/pkg/expr/mongo.go index 5a503a7e..6e189db8 100644 --- a/pkg/expr/mongo.go +++ b/pkg/expr/mongo.go @@ -62,7 +62,7 @@ func convertToMongo(ctx context.Context, config *MongoExprConfig, tree *parser.T op(exprConfig) } - env = exprConfig.Env.(map[string]interface{}) + env, _ = exprConfig.EnvObject.(map[string]interface{}) c := &compiler{ tree: tree, @@ -135,8 +135,6 @@ func (c *compiler) compile(node ast.Node) interface{} { return c.CallNode(n) case *ast.BuiltinNode: return c.BuiltinNode(n) - case *ast.ClosureNode: - return c.ClosureNode(n) case *ast.PointerNode: return c.PointerNode(n) case *ast.ConditionalNode: @@ -615,10 +613,6 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) interface{} { // return size // } -func (c *compiler) ClosureNode(node *ast.ClosureNode) interface{} { - return c.compile(node.Node) -} - func (c *compiler) PointerNode(node *ast.PointerNode) interface{} { panic("unsupported pointer node") // c.emit(OpLoad, c.makeConstant("array")...) -- GitLab