From e44f39ceb0131d1f55fe6cfdfd5cce630e2b60dd Mon Sep 17 00:00:00 2001
From: Danis Kirasirov <dbgbbu@gmail.com>
Date: Tue, 27 Feb 2024 16:53:06 +0300
Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?=
 =?UTF-8?q?=D0=B0=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F=20try?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pkg/expr/mongo.go      | 22 ++++++++--------------
 pkg/expr/mongo_test.go |  8 ++++----
 2 files changed, 12 insertions(+), 18 deletions(-)

diff --git a/pkg/expr/mongo.go b/pkg/expr/mongo.go
index 71f3bdda..bb4187dd 100644
--- a/pkg/expr/mongo.go
+++ b/pkg/expr/mongo.go
@@ -713,7 +713,7 @@ func (c *compiler) handleLenNode(node *ast.BinaryNode) bson.M {
 	}
 }
 
-// handleTryNode получает узел AST с двумя выражениями-строками и пытается выполнить первое
+// handleTryNode получает узел AST с двумя выражениями и пытается выполнить первое
 // в случае успеха - возвращает его
 // в случае ошибки - пытается выполнить второе и вернуть его результат
 func (c *compiler) handleTryNode(node *ast.CallNode) (result interface{}) {
@@ -721,23 +721,17 @@ func (c *compiler) handleTryNode(node *ast.CallNode) (result interface{}) {
 		panic("try() expects exactly 2 arguments")
 	}
 
-	subcompiler := &compiler{env: c.env, config: c.config, identifierRenameFn: c.identifierRenameFn}
-	subexprCompile := func(subexpr string) interface{} {
-		tree, err := parser.Parse(subexpr)
-		if err != nil {
-			panic(err)
-		}
-
-		subcompiler.tree = tree
-		return subcompiler.compile(tree.Node)
-	}
-
 	defer func() {
 		if r := recover(); r != nil {
-			result = subexprCompile(node.Arguments[1].(*ast.StringNode).Value)
+			result = c.compile(node.Arguments[1])
 		}
 	}()
 
-	result = subexprCompile(node.Arguments[0].(*ast.StringNode).Value).(bson.M)
+	tree, err := parser.Parse(node.Arguments[0].(*ast.StringNode).Value)
+	if err != nil {
+		panic(err)
+	}
+	subcompiler := &compiler{tree: tree, env: c.env, config: c.config, identifierRenameFn: c.identifierRenameFn}
+	result = subcompiler.compile(tree.Node).(bson.M)
 	return
 }
diff --git a/pkg/expr/mongo_test.go b/pkg/expr/mongo_test.go
index 65070bbc..9a7df77d 100644
--- a/pkg/expr/mongo_test.go
+++ b/pkg/expr/mongo_test.go
@@ -79,10 +79,10 @@ func TestConvertToMongo(t *testing.T) {
 		{"in", "In(s, 1)", nil, bson.M{"s": bson.M{"$in": []interface{}{1}}}, false},
 		{"text search or id", "id", nil, nil, true},
 		{"struct env", "db_item.id == env_item.id", map[string]interface{}{"env_item": &testEnvStruct{ID: "id1"}}, bson.M{"db_item.id": "id1"}, false},
-		{"try#1", "try('s == 1', 's == 2')", nil, bson.M{"s": 1}, false},
-		{"try#2", "try('some-slug', 'search(\\'some\\') || _id contains \\'some-slug\\'')", nil, bson.M{"$or": bson.A{bson.M{"$text": bson.M{"$search": "some"}}, bson.M{"_id": bson.M{"$regex": "some-slug"}}}}, false},
-		{"try#3", "try(bad-expr, bad-expr)", nil, nil, true},
-		{"try#4", "try('3', 's == 1')", nil, bson.M{"s": 1}, false},
+		{"try#1", "try('s == 1', s == 2)", nil, bson.M{"s": 1}, false},
+		{"try#2", "try('some-slug', search('some-slug') || _id contains 'some-slug')", nil, bson.M{"$or": bson.A{bson.M{"$text": bson.M{"$search": "some-slug"}}, bson.M{"_id": bson.M{"$regex": "some-slug"}}}}, false},
+		{"try#3", "try('bad-expr', bad-expr)", nil, nil, true},
+		{"try#4", "try('3', s == 1)", nil, bson.M{"s": 1}, false},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-- 
GitLab