3
0

Simplify record value set assignment in expressions

Allow expressions like:
rec.values = rec2
rec.values = rec2.values
This commit is contained in:
Denis Arh 2021-03-24 20:31:50 +01:00
parent 7e81c6bd17
commit fcd0a5b052
3 changed files with 56 additions and 1 deletions

View File

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

View File

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

View File

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