3
0

Fix record-value setting

This commit is contained in:
Denis Arh 2021-02-15 18:25:11 +01:00
parent cf95d42b5b
commit 6903ecfcf2
6 changed files with 34 additions and 16 deletions

View File

@ -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

View File

@ -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)

View File

@ -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'

View File

@ -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()
)

View File

@ -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

View File

@ -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