3
0

More strict variable handling in assigners/converers

This commit is contained in:
Denis Arh
2021-03-25 08:15:23 +01:00
parent 605b109402
commit b428752412
12 changed files with 44 additions and 35 deletions

View File

@@ -56,7 +56,7 @@ func (t *ComposeModule) Assign(val interface{}) error {
}
}
func (t *ComposeModule) AssignFieldValue(key string, val interface{}) error {
func (t *ComposeModule) AssignFieldValue(key string, val TypedValue) error {
return assignToComposeModule(t.value, key, val)
}
@@ -226,7 +226,7 @@ func (t *ComposeNamespace) Assign(val interface{}) error {
}
}
func (t *ComposeNamespace) AssignFieldValue(key string, val interface{}) error {
func (t *ComposeNamespace) AssignFieldValue(key string, val TypedValue) error {
return assignToComposeNamespace(t.value, key, val)
}

View File

@@ -70,7 +70,7 @@ var _ expr.DeepFieldAssigner = &ComposeRecord{}
//
// 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 {
func (t *ComposeRecord) AssignFieldValue(kk []string, val expr.TypedValue) error {
switch kk[0] {
case "values":
return assignToComposeRecordValues(&t.value.Values, kk[1:], val)
@@ -145,7 +145,7 @@ func CastToComposeRecordValues(val interface{}) (out types.RecordValueSet, err e
}
}
func (t *ComposeRecordValues) AssignFieldValue(pp []string, val interface{}) error {
func (t *ComposeRecordValues) AssignFieldValue(pp []string, val expr.TypedValue) error {
return assignToComposeRecordValues(&t.value, pp, val)
}

View File

@@ -16,8 +16,8 @@ func TestSetRecordValuesWithPath(t *testing.T) {
rvs = &ComposeRecordValues{types.RecordValueSet{}}
)
r.NoError(expr.Assign(rvs, "field1", "a"))
r.NoError(expr.Assign(rvs, "field1.1", "a"))
r.NoError(expr.Assign(rvs, "field1", expr.Must(expr.NewString("a"))))
r.NoError(expr.Assign(rvs, "field1.1", expr.Must(expr.NewString("a"))))
r.True(rvs.value.Has("field1", 0))
r.True(rvs.value.Has("field1", 1))
})

View File

@@ -65,7 +65,7 @@ func (t *{{ $exprType }}) Assign(val interface{}) (error) {
{{ if $def.Struct }}
{{ if not $def.CustomFieldAssigner }}
func (t *{{ $exprType }}) AssignFieldValue(key string, val interface{}) error {
func (t *{{ $exprType }}) AssignFieldValue(key string, val TypedValue) error {
return {{ $def.AssignerFn }}(t.value, key, val)
}
{{ end }}

View File

@@ -65,7 +65,7 @@ func PathBase(path string) string {
return strings.Split(path, ".")[0]
}
func Assign(base TypedValue, path string, val interface{}) error {
func Assign(base TypedValue, path string, val TypedValue) error {
pp, err := PathSplit(path)
if err != nil {
return err

View File

@@ -52,18 +52,29 @@ func TestVars(t *testing.T) {
}.Vars(),
}.Vars(),
}.Vars()
tv = func(in interface{}) TypedValue {
switch cnv := in.(type) {
case int:
return Must(NewInteger(cnv))
case string:
return Must(NewString(cnv))
}
return Must(NewAny(in))
}
)
req.NoError(Assign(vars, "int", 123))
req.Equal(123, Must(Select(vars, "int")).Get().(int))
req.NoError(Assign(vars, "int", tv(123)))
req.Equal(int64(123), Must(Select(vars, "int")).Get().(int64))
req.NoError(Assign(vars, "sub.foo", "bar"))
req.NoError(Assign(vars, "sub.foo", tv("bar")))
req.Equal("bar", Must(Select(vars, "sub.foo")).Get().(string))
req.NoError(Assign(vars, "kv", &KV{}))
req.NoError(Assign(vars, "kv.foo", "bar"))
req.NoError(Assign(vars, "kv.foo", tv("bar")))
req.Equal("bar", Must(Select(vars, "kv.foo")).Get().(string))
req.NoError(Assign(vars, "three.two.one.go", "!!!"))
req.NoError(Assign(vars, "three.two.one.go", tv("!!!")))
req.Equal("!!!", Must(Select(vars, "three.two.one.go")).Get().(string))
}

View File

@@ -5,6 +5,7 @@ import (
"context"
"encoding/json"
"fmt"
"github.com/davecgh/go-spew/spew"
"io"
"net/http"
"net/url"
@@ -222,11 +223,11 @@ func (t *KV) Select(k string) (TypedValue, error) {
}
}
func (t *KV) AssignFieldValue(key string, val interface{}) error {
func (t *KV) AssignFieldValue(key string, val TypedValue) error {
return assignToKV(t, key, val)
}
func assignToKV(t *KV, key string, val interface{}) error {
func assignToKV(t *KV, key string, val TypedValue) error {
if t.value == nil {
t.value = make(map[string]string)
}
@@ -247,20 +248,21 @@ func CastToKV(val interface{}) (out map[string]string, err error) {
case map[string]string:
return casted, nil
default:
return cast.ToStringMapStringE(casted)
return cast.ToStringMapStringE(UntypedValue(casted))
}
}
func (t *KVV) AssignFieldValue(key string, val interface{}) error {
func (t *KVV) AssignFieldValue(key string, val TypedValue) error {
return assignToKVV(t, key, val)
}
func assignToKVV(t *KVV, key string, val interface{}) error {
func assignToKVV(t *KVV, key string, val TypedValue) error {
if t.value == nil {
t.value = make(map[string][]string)
}
str, err := cast.ToStringSliceE(val)
spew.Dump(val)
str, err := cast.ToStringSliceE(val.Get())
t.value[key] = str
return err
}

View File

@@ -17,7 +17,7 @@ func TestKV_Set(t *testing.T) {
}}
)
req.NoError(Assign(&vars, "k1", "v11"))
req.NoError(Assign(&vars, "k1", Must(NewString("v11"))))
req.Equal("v11", vars.value["k1"])
req.Equal("v2", vars.value["k2"])
@@ -29,7 +29,7 @@ func TestKVV_Set(t *testing.T) {
kvv KVV
)
req.NoError(Assign(&kvv, "foo", "bar"))
req.NoError(Assign(&kvv, "foo", Must(NewString("bar"))))
req.Contains(kvv.value, "foo")
req.Equal([]string{"bar"}, kvv.value["foo"])

View File

@@ -29,11 +29,11 @@ type (
}
FieldAssigner interface {
AssignFieldValue(string, interface{}) error
AssignFieldValue(string, TypedValue) error
}
DeepFieldAssigner interface {
AssignFieldValue([]string, interface{}) error
AssignFieldValue([]string, TypedValue) error
}
Iterator interface {

View File

@@ -33,16 +33,12 @@ func (t Vars) Select(k string) (TypedValue, error) {
}
}
func (t *Vars) AssignFieldValue(key string, val interface{}) (err error) {
func (t *Vars) AssignFieldValue(key string, val TypedValue) (err error) {
if t.value == nil {
t.value = make(RVars)
}
if tv, is := val.(TypedValue); is {
t.value[key] = tv
} else {
t.value[key] = Must(NewAny(val))
}
t.value[key] = val
return err
}

View File

@@ -56,7 +56,7 @@ func (t *Document) Assign(val interface{}) error {
}
}
func (t *Document) AssignFieldValue(key string, val interface{}) error {
func (t *Document) AssignFieldValue(key string, val TypedValue) error {
return assignToDocument(t.value, key, val)
}
@@ -300,7 +300,7 @@ func (t *Role) Assign(val interface{}) error {
}
}
func (t *Role) AssignFieldValue(key string, val interface{}) error {
func (t *Role) AssignFieldValue(key string, val TypedValue) error {
return assignToRole(t.value, key, val)
}
@@ -470,7 +470,7 @@ func (t *Template) Assign(val interface{}) error {
}
}
func (t *Template) AssignFieldValue(key string, val interface{}) error {
func (t *Template) AssignFieldValue(key string, val TypedValue) error {
return assignToTemplate(t.value, key, val)
}
@@ -704,7 +704,7 @@ func (t *TemplateMeta) Assign(val interface{}) error {
}
}
func (t *TemplateMeta) AssignFieldValue(key string, val interface{}) error {
func (t *TemplateMeta) AssignFieldValue(key string, val TypedValue) error {
return assignToTemplateMeta(t.value, key, val)
}
@@ -820,7 +820,7 @@ func (t *User) Assign(val interface{}) error {
}
}
func (t *User) AssignFieldValue(key string, val interface{}) error {
func (t *User) AssignFieldValue(key string, val TypedValue) error {
return assignToUser(t.value, key, val)
}

View File

@@ -17,7 +17,7 @@ func TestUser(t *testing.T) {
req.NoError(err)
req.Equal("handle", u.value.Handle)
req.Error(u.AssignFieldValue("some-unexisting-field", nil))
req.NoError(u.AssignFieldValue("email", "dummy@domain.tpl"))
req.NoError(u.AssignFieldValue("email", expr.Must(expr.NewString("dummy@domain.tpl"))))
req.Equal("dummy@domain.tpl", u.value.Email)
}