diff --git a/compose/automation/expr_types.go b/compose/automation/expr_types.go index e121141ab..ffad3b105 100644 --- a/compose/automation/expr_types.go +++ b/compose/automation/expr_types.go @@ -210,6 +210,15 @@ func composeRecordValuesTypedValueSelector(res types.RecordValueSet, k string) ( // assignToRecordValuesSet is field value setter for *types.Record func assignToComposeRecordValues(res *types.RecordValueSet, pp []string, val interface{}) (err error) { if len(pp) < 1 { + switch val := expr.UntypedValue(val).(type) { + case types.RecordValueSet: + *res = val + return + case *types.Record: + *res = val.Values + return + } + return fmt.Errorf("empty path used for assigning record values") } k := pp[0] diff --git a/compose/automation/expr_types_test.go b/compose/automation/expr_types_test.go index 651d49b2b..ab0c847bb 100644 --- a/compose/automation/expr_types_test.go +++ b/compose/automation/expr_types_test.go @@ -129,7 +129,54 @@ func TestRecordFieldValuesAccess(t *testing.T) { eval, err = parser.Parse(`rec.values.m2[0] == "mVal2.0"`) req.NoError(err) req.True(eval.Test(context.Background(), scope)) + }) +} +func TestAssignToComposeRecordValues(t *testing.T) { + t.Run("assign simple", func(t *testing.T) { + var ( + req = require.New(t) + target = types.RecordValueSet{} + ) + + req.NoError(assignToComposeRecordValues(&target, []string{"a"}, "b")) + req.Len(target, 1) + req.True(target.Has("a", 0)) + req.NoError(assignToComposeRecordValues(&target, []string{"a", "1"}, "b")) + req.Len(target, 2) + req.True(target.Has("a", 0)) + req.True(target.Has("a", 1)) }) + t.Run("assign rvs", func(t *testing.T) { + var ( + req = require.New(t) + target = types.RecordValueSet{} + ) + + req.NoError(assignToComposeRecordValues(&target, nil, types.RecordValueSet{{}})) + req.Len(target, 1) + }) + + t.Run("assign record", func(t *testing.T) { + var ( + req = require.New(t) + target = types.RecordValueSet{} + ) + + req.NoError(assignToComposeRecordValues(&target, nil, &types.Record{Values: types.RecordValueSet{{}}})) + req.Len(target, 1) + }) + + t.Run("overwrite rvs", func(t *testing.T) { + var ( + req = require.New(t) + target = types.RecordValueSet{{Name: "a"}} + ) + + req.NoError(assignToComposeRecordValues(&target, nil, types.RecordValueSet{{Name: "b"}})) + req.Len(target, 1) + req.False(target.Has("a", 0)) + req.True(target.Has("b", 0)) + }) } diff --git a/compose/automation/records_handler.go b/compose/automation/records_handler.go index 6dae68089..0e529cecc 100644 --- a/compose/automation/records_handler.go +++ b/compose/automation/records_handler.go @@ -4,7 +4,6 @@ import ( "context" "errors" "fmt" - "github.com/cortezaproject/corteza-server/compose/types" . "github.com/cortezaproject/corteza-server/pkg/expr" "github.com/cortezaproject/corteza-server/pkg/filter"