More strict variable handling in assigners/converers
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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))
|
||||
})
|
||||
|
||||
@@ -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 }}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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"])
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user