From 6903ecfcf2c76b2c62277e6be5a00313989cd663 Mon Sep 17 00:00:00 2001 From: Denis Arh Date: Mon, 15 Feb 2021 18:25:11 +0100 Subject: [PATCH] Fix record-value setting --- compose/automation/expr_types.gen.go | 4 ---- compose/automation/expr_types.go | 19 +++++++++++++++++++ compose/automation/expr_types.yaml | 2 +- compose/automation/expr_types_test.go | 8 ++++---- pkg/codegen/assets/expr_types.gen.go.tpl | 2 ++ pkg/codegen/expr_types.go | 15 ++++++++------- 6 files changed, 34 insertions(+), 16 deletions(-) diff --git a/compose/automation/expr_types.gen.go b/compose/automation/expr_types.gen.go index 471754dd5..1cd38f430 100644 --- a/compose/automation/expr_types.gen.go +++ b/compose/automation/expr_types.gen.go @@ -388,10 +388,6 @@ func (t *ComposeRecord) Assign(val interface{}) error { } } -func (t *ComposeRecord) AssignFieldValue(key string, val interface{}) error { - return assignToComposeRecord(t.value, key, val) -} - // Select is field accessor for *types.Record // // Similar to SelectGVal but returns typed values diff --git a/compose/automation/expr_types.go b/compose/automation/expr_types.go index 4a771ce77..5fb50827f 100644 --- a/compose/automation/expr_types.go +++ b/compose/automation/expr_types.go @@ -3,6 +3,7 @@ package automation import ( "context" "fmt" + "github.com/PaesslerAG/gval" "github.com/cortezaproject/corteza-server/compose/types" "github.com/cortezaproject/corteza-server/pkg/expr" "github.com/spf13/cast" @@ -60,6 +61,24 @@ func CastToComposeRecord(val interface{}) (out *types.Record, err error) { } } +var _ expr.DeepFieldAssigner = &ComposeRecord{} + +// AssignFieldValue implements expr.DeepFieldAssigner +// +// We need to reroute value assigning for record-value-sets because +// we loose the reference to record-value slice +func (t *ComposeRecord) AssignFieldValue(kk []string, val interface{}) error { + switch kk[0] { + case "values": + return assignToComposeRecordValues(&t.value.Values, kk[1:], val) + // @todo deep setting labels + default: + return assignToComposeRecord(t.value, kk[0], val) + } +} + +var _ gval.Selector = &ComposeRecord{} + // SelectGVal implements gval.Selector requirements // // It allows gval lib to access Record's underlying value (*types.Record) diff --git a/compose/automation/expr_types.yaml b/compose/automation/expr_types.yaml index e11a646d0..0278fbe0a 100644 --- a/compose/automation/expr_types.yaml +++ b/compose/automation/expr_types.yaml @@ -41,10 +41,10 @@ types: - { name: 'deletedAt', exprType: 'DateTime', goType: '*time.Time', mode: ro } - { name: 'deletedBy', exprType: 'ID', goType: 'uint64', mode: ro } customGValSelector: true + customFieldAssigner: true ComposeRecordValues: as: 'types.RecordValueSet' - castFn: 'castComposeRecordValueSet' ComposeRecordValueErrorSet: as: '*types.RecordValueErrorSet' diff --git a/compose/automation/expr_types_test.go b/compose/automation/expr_types_test.go index 0f2313a54..651d49b2b 100644 --- a/compose/automation/expr_types_test.go +++ b/compose/automation/expr_types_test.go @@ -13,7 +13,7 @@ func TestSetRecordValuesWithPath(t *testing.T) { var ( r = require.New(t) - rvs = &RecordValues{types.RecordValueSet{}} + rvs = &ComposeRecordValues{types.RecordValueSet{}} ) r.NoError(expr.Assign(rvs, "field1", "a")) @@ -26,7 +26,7 @@ func TestSetRecordValuesWithPath(t *testing.T) { var ( r = require.New(t) - rvs, err = CastToRecordValues(map[string]string{"field2": "b"}) + rvs, err = CastToComposeRecordValues(map[string]string{"field2": "b"}) ) r.NoError(err) @@ -37,7 +37,7 @@ func TestSetRecordValuesWithPath(t *testing.T) { var ( r = require.New(t) - rvs, err = CastToRecordValues(map[string][]string{"field2": []string{"a", "b"}}) + rvs, err = CastToComposeRecordValues(map[string][]string{"field2": []string{"a", "b"}}) ) r.NoError(err) @@ -66,7 +66,7 @@ func TestRecordFieldValuesAccess(t *testing.T) { &types.RecordValue{Name: "m2", Value: "mVal2.0"}, }} - tval = &Record{value: raw} + tval = &ComposeRecord{value: raw} scope = expr.RVars{"rec": tval}.Vars() ) diff --git a/pkg/codegen/assets/expr_types.gen.go.tpl b/pkg/codegen/assets/expr_types.gen.go.tpl index 7adb2916f..737cd0ca7 100644 --- a/pkg/codegen/assets/expr_types.gen.go.tpl +++ b/pkg/codegen/assets/expr_types.gen.go.tpl @@ -68,9 +68,11 @@ func (t *{{ $exprType }}) Assign(val interface{}) (error) { {{ if $def.Struct }} +{{ if not $def.CustomFieldAssigner }} func (t *{{ $exprType }}) AssignFieldValue(key string, val interface{}) error { return {{ $def.AssignerFn }}(t.value, key, val) } +{{ end }} {{ if not $def.CustomGValSelector }} // SelectGVal implements gval.Selector requirements diff --git a/pkg/codegen/expr_types.go b/pkg/codegen/expr_types.go index cfe09b4d8..97c188c18 100644 --- a/pkg/codegen/expr_types.go +++ b/pkg/codegen/expr_types.go @@ -23,13 +23,14 @@ type ( } exprTypeDef struct { - As string - RawDefault string `yaml:"default"` - AssignerFn string `yaml:"assignerFn"` - BuiltInCastFn bool - BuiltInAssignerFn bool - CustomGValSelector bool `yaml:"customGValSelector"` - Struct []*exprTypeStructDef + As string + RawDefault string `yaml:"default"` + AssignerFn string `yaml:"assignerFn"` + BuiltInCastFn bool + BuiltInAssignerFn bool + CustomGValSelector bool `yaml:"customGValSelector"` + CustomFieldAssigner bool `yaml:"customFieldAssigner"` + Struct []*exprTypeStructDef // @todo custom setters // @todo custom getters