Factor pointer handling
This commit is contained in:
-36
@@ -166,15 +166,6 @@ func setString(t target, v string) error {
|
|||||||
return t.setString(v)
|
return t.setString(v)
|
||||||
case reflect.Interface:
|
case reflect.Interface:
|
||||||
return t.set(reflect.ValueOf(v))
|
return t.set(reflect.ValueOf(v))
|
||||||
case reflect.Ptr:
|
|
||||||
if !f.Elem().IsValid() {
|
|
||||||
err := t.set(reflect.New(f.Type().Elem()))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
f = t.get()
|
|
||||||
}
|
|
||||||
return setString(valueTarget(f.Elem()), v)
|
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("cannot assign string to a %s", f.Kind())
|
return fmt.Errorf("cannot assign string to a %s", f.Kind())
|
||||||
}
|
}
|
||||||
@@ -188,15 +179,6 @@ func setBool(t target, v bool) error {
|
|||||||
return t.setBool(v)
|
return t.setBool(v)
|
||||||
case reflect.Interface:
|
case reflect.Interface:
|
||||||
return t.set(reflect.ValueOf(v))
|
return t.set(reflect.ValueOf(v))
|
||||||
case reflect.Ptr:
|
|
||||||
if !f.Elem().IsValid() {
|
|
||||||
err := t.set(reflect.New(f.Type().Elem()))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
f = t.get()
|
|
||||||
}
|
|
||||||
return setBool(valueTarget(f.Elem()), v)
|
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("cannot assign bool to a %s", f.String())
|
return fmt.Errorf("cannot assign bool to a %s", f.String())
|
||||||
}
|
}
|
||||||
@@ -268,15 +250,6 @@ func setInt64(t target, v int64) error {
|
|||||||
return t.set(reflect.ValueOf(uint(v)))
|
return t.set(reflect.ValueOf(uint(v)))
|
||||||
case reflect.Interface:
|
case reflect.Interface:
|
||||||
return t.set(reflect.ValueOf(v))
|
return t.set(reflect.ValueOf(v))
|
||||||
case reflect.Ptr:
|
|
||||||
if !f.Elem().IsValid() {
|
|
||||||
err := t.set(reflect.New(f.Type().Elem()))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
f = t.get()
|
|
||||||
}
|
|
||||||
return setInt64(valueTarget(f.Elem()), v)
|
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("cannot assign int64 to a %s", f.String())
|
return fmt.Errorf("cannot assign int64 to a %s", f.String())
|
||||||
}
|
}
|
||||||
@@ -295,15 +268,6 @@ func setFloat64(t target, v float64) error {
|
|||||||
return t.set(reflect.ValueOf(float32(v)))
|
return t.set(reflect.ValueOf(float32(v)))
|
||||||
case reflect.Interface:
|
case reflect.Interface:
|
||||||
return t.set(reflect.ValueOf(v))
|
return t.set(reflect.ValueOf(v))
|
||||||
case reflect.Ptr:
|
|
||||||
if !f.Elem().IsValid() {
|
|
||||||
err := t.set(reflect.New(f.Type().Elem()))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
f = t.get()
|
|
||||||
}
|
|
||||||
return setFloat64(valueTarget(f.Elem()), v)
|
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("cannot assign float64 to a %s", f.String())
|
return fmt.Errorf("cannot assign float64 to a %s", f.String())
|
||||||
}
|
}
|
||||||
|
|||||||
+12
-11
@@ -173,17 +173,6 @@ var textUnmarshalerType = reflect.TypeOf(new(encoding.TextUnmarshaler)).Elem()
|
|||||||
func tryTextUnmarshaler(x target, node *ast.Node) (bool, error) {
|
func tryTextUnmarshaler(x target, node *ast.Node) (bool, error) {
|
||||||
v := x.get()
|
v := x.get()
|
||||||
|
|
||||||
if v.Kind() == reflect.Ptr {
|
|
||||||
if !v.Elem().IsValid() {
|
|
||||||
err := x.set(reflect.New(v.Type().Elem()))
|
|
||||||
if err != nil {
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
v = x.get()
|
|
||||||
}
|
|
||||||
return tryTextUnmarshaler(valueTarget(v.Elem()), node)
|
|
||||||
}
|
|
||||||
|
|
||||||
if v.Kind() != reflect.Struct {
|
if v.Kind() != reflect.Struct {
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
@@ -197,6 +186,18 @@ func tryTextUnmarshaler(x target, node *ast.Node) (bool, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *decoder) unmarshalValue(x target, node *ast.Node) error {
|
func (d *decoder) unmarshalValue(x target, node *ast.Node) error {
|
||||||
|
v := x.get()
|
||||||
|
if v.Kind() == reflect.Ptr {
|
||||||
|
if !v.Elem().IsValid() {
|
||||||
|
err := x.set(reflect.New(v.Type().Elem()))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
v = x.get()
|
||||||
|
}
|
||||||
|
return d.unmarshalValue(valueTarget(v.Elem()), node)
|
||||||
|
}
|
||||||
|
|
||||||
ok, err := tryTextUnmarshaler(x, node)
|
ok, err := tryTextUnmarshaler(x, node)
|
||||||
if ok {
|
if ok {
|
||||||
return err
|
return err
|
||||||
|
|||||||
Reference in New Issue
Block a user