From 43fc2fa552be5b183cddeb212cbf430bcb85ec86 Mon Sep 17 00:00:00 2001 From: Thomas Pelletier Date: Wed, 24 Mar 2021 21:05:44 -0400 Subject: [PATCH] Factor pointer handling --- targets.go | 36 ------------------------------------ unmarshaler.go | 23 ++++++++++++----------- 2 files changed, 12 insertions(+), 47 deletions(-) diff --git a/targets.go b/targets.go index e620d28..2fd410d 100644 --- a/targets.go +++ b/targets.go @@ -166,15 +166,6 @@ func setString(t target, v string) error { return t.setString(v) case reflect.Interface: 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: 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) case reflect.Interface: 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: 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))) case reflect.Interface: 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: 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))) case reflect.Interface: 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: return fmt.Errorf("cannot assign float64 to a %s", f.String()) } diff --git a/unmarshaler.go b/unmarshaler.go index bba90ff..d8b31d6 100644 --- a/unmarshaler.go +++ b/unmarshaler.go @@ -173,17 +173,6 @@ var textUnmarshalerType = reflect.TypeOf(new(encoding.TextUnmarshaler)).Elem() func tryTextUnmarshaler(x target, node *ast.Node) (bool, 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 false, nil - } - v = x.get() - } - return tryTextUnmarshaler(valueTarget(v.Elem()), node) - } - if v.Kind() != reflect.Struct { 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 { + 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) if ok { return err