From 9d14e5929ffeb4eeee99a4a78320982f95be4278 Mon Sep 17 00:00:00 2001 From: Joel Wetzell Date: Sun, 1 Mar 2026 23:49:53 -0600 Subject: [PATCH] wrap all payload types for expr env --- internal/processor/filter-expr.go | 26 +++---- internal/processor/script-expr.go | 17 +---- internal/processor/test/filter-expr_test.go | 10 +-- internal/processor/test/script-expr_test.go | 75 +++++---------------- 4 files changed, 34 insertions(+), 94 deletions(-) diff --git a/internal/processor/filter-expr.go b/internal/processor/filter-expr.go index f442e86..a075ccd 100644 --- a/internal/processor/filter-expr.go +++ b/internal/processor/filter-expr.go @@ -15,27 +15,21 @@ type FilterExpr struct { Program *vm.Program } -type PayloadStruct struct { +func SafeExprEnv(payload any) any { + exprEnv := ExprEnv{ + Payload: payload, + } + + return exprEnv +} + +type ExprEnv struct { Payload any } func (se *FilterExpr) Process(ctx context.Context, payload any) (any, error) { - payloadType := fmt.Sprintf("%T", payload) - exprEnv := payload - - switch payloadType { - case "uint", "uint8", "uint16", "uint32", "uint64": - exprEnv = PayloadStruct{Payload: payload} - case "int", "int8", "int16", "int32", "int64": - exprEnv = PayloadStruct{Payload: payload} - case "float32", "float64": - exprEnv = PayloadStruct{Payload: payload} - case "string": - exprEnv = PayloadStruct{Payload: payload} - case "bool": - exprEnv = PayloadStruct{Payload: payload} - } + exprEnv := SafeExprEnv(payload) output, err := expr.Run(se.Program, exprEnv) if err != nil { diff --git a/internal/processor/script-expr.go b/internal/processor/script-expr.go index 0a4440b..421cf63 100644 --- a/internal/processor/script-expr.go +++ b/internal/processor/script-expr.go @@ -17,22 +17,7 @@ type ScriptExpr struct { func (se *ScriptExpr) Process(ctx context.Context, payload any) (any, error) { - payloadType := fmt.Sprintf("%T", payload) - - exprEnv := payload - - switch payloadType { - case "uint", "uint8", "uint16", "uint32", "uint64": - exprEnv = PayloadStruct{Payload: payload} - case "int", "int8", "int16", "int32", "int64": - exprEnv = PayloadStruct{Payload: payload} - case "float32", "float64": - exprEnv = PayloadStruct{Payload: payload} - case "string": - exprEnv = PayloadStruct{Payload: payload} - case "bool": - exprEnv = PayloadStruct{Payload: payload} - } + exprEnv := SafeExprEnv(payload) output, err := expr.Run(se.Program, exprEnv) if err != nil { diff --git a/internal/processor/test/filter-expr_test.go b/internal/processor/test/filter-expr_test.go index 5d20819..5471037 100644 --- a/internal/processor/test/filter-expr_test.go +++ b/internal/processor/test/filter-expr_test.go @@ -39,7 +39,7 @@ func TestGoodFilterExpr(t *testing.T) { { name: "number", params: map[string]any{ - "expression": "Int > 0", + "expression": "Payload.Int > 0", }, payload: TestStruct{ Int: 1, @@ -51,7 +51,7 @@ func TestGoodFilterExpr(t *testing.T) { { name: "string", params: map[string]any{ - "expression": "String == 'hello'", + "expression": "Payload.String == 'hello'", }, payload: TestStruct{ String: "hello", @@ -63,7 +63,7 @@ func TestGoodFilterExpr(t *testing.T) { { name: "not matching", params: map[string]any{ - "expression": "Int > 0", + "expression": "Payload.Int > 0", }, payload: TestStruct{ Int: 0, @@ -136,12 +136,12 @@ func TestBadFilterExpr(t *testing.T) { { name: "accessing missing field", params: map[string]any{ - "expression": "foo + bar", + "expression": "Payload.foo + Payload.bar", }, payload: map[string]any{ "foo": 1, }, - errorString: "invalid operation: int + (1:5)\n | foo + bar\n | ....^", + errorString: "invalid operation: int + (1:13)\n | Payload.foo + Payload.bar\n | ............^", }, } diff --git a/internal/processor/test/script-expr_test.go b/internal/processor/test/script-expr_test.go index a85ad93..b12fca6 100644 --- a/internal/processor/test/script-expr_test.go +++ b/internal/processor/test/script-expr_test.go @@ -28,58 +28,6 @@ func TestScriptExprFromRegistry(t *testing.T) { } } -func TestScriptExprNoProgram(t *testing.T) { - registration, ok := processor.ProcessorRegistry["script.expr"] - if !ok { - t.Fatalf("script.expr processor not registered") - } - - _, err := registration.New(config.ProcessorConfig{ - Type: "script.expr", - Params: map[string]any{}, - }) - - if err == nil { - t.Fatalf("script.expr processor should have thrown an error when creating") - } -} - -func TestScriptExprBadConfigWrongExpressionType(t *testing.T) { - registration, ok := processor.ProcessorRegistry["script.expr"] - if !ok { - t.Fatalf("script.expr processor not registered") - } - - _, err := registration.New(config.ProcessorConfig{ - Type: "script.expr", - Params: map[string]any{ - "expression": 12345, - }, - }) - - if err == nil { - t.Fatalf("script.expr processor should have thrown an error when creating with non-string expression") - } -} - -func TestScriptExprBadConfigNonCompilingExpression(t *testing.T) { - registration, ok := processor.ProcessorRegistry["script.expr"] - if !ok { - t.Fatalf("script.expr processor not registered") - } - - _, err := registration.New(config.ProcessorConfig{ - Type: "script.expr", - Params: map[string]any{ - "expression": "foo + ", - }, - }) - - if err == nil { - t.Fatalf("script.expr processor should have thrown an error when creating with non-compiling expression") - } -} - func TestGoodScriptExpr(t *testing.T) { tests := []struct { name string @@ -90,7 +38,7 @@ func TestGoodScriptExpr(t *testing.T) { { name: "number", params: map[string]any{ - "expression": "foo + bar", + "expression": "Payload.foo + Payload.bar", }, payload: map[string]any{ "foo": 1, @@ -101,7 +49,7 @@ func TestGoodScriptExpr(t *testing.T) { { name: "string", params: map[string]any{ - "expression": "foo + bar", + "expression": "Payload.foo + Payload.bar", }, payload: map[string]any{ "foo": "1", @@ -145,18 +93,24 @@ func TestBadScriptExpr(t *testing.T) { tests := []struct { name string params map[string]any - payload map[string]any + payload any errorString string }{ + { + name: "no expression parameter", + params: map[string]any{}, + payload: map[string]any{"foo": 1, "bar": 1}, + errorString: "script.expr expression error: not found", + }, { name: "accessing missing field", params: map[string]any{ - "expression": "foo + bar", + "expression": "Payload.foo + Payload.bar", }, payload: map[string]any{ "foo": 1, }, - errorString: "invalid operation: int + (1:5)\n | foo + bar\n | ....^", + errorString: "invalid operation: int + (1:13)\n | Payload.foo + Payload.bar\n | ............^", }, } @@ -172,6 +126,13 @@ func TestBadScriptExpr(t *testing.T) { Params: test.params, }) + if err != nil { + if err.Error() != test.errorString { + t.Fatalf("script.expr got error '%s', expected '%s'", err.Error(), test.errorString) + } + return + } + got, err := processorInstance.Process(t.Context(), test.payload) if err == nil {