From 46f143c7336f723ce5ba9bda5d78f11b19efda4f Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Fri, 10 Feb 2023 18:36:36 -0700 Subject: decode: Have .decodeNull() return a *DecodeError --- decode.go | 54 +++++++++++++++++++++++++++++------------------------- 1 file changed, 29 insertions(+), 25 deletions(-) (limited to 'decode.go') diff --git a/decode.go b/decode.go index 237c739..522e41e 100644 --- a/decode.go +++ b/decode.go @@ -424,8 +424,7 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) (_err *DecodeError) { } case val.CanAddr() && reflect.PointerTo(typ).Implements(textUnmarshalerType): if nullOK && dec.peekRuneType() == jsonparse.RuneTypeNullN { - dec.decodeNull() - return + return dec.decodeNull() } var buf bytes.Buffer dec.decodeString(reflect.PointerTo(typ), &buf) @@ -437,8 +436,7 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) (_err *DecodeError) { switch kind := typ.Kind(); kind { case reflect.Bool: if nullOK && dec.peekRuneType() == jsonparse.RuneTypeNullN { - dec.decodeNull() - return + return dec.decodeNull() } b, err := dec.decodeBool(typ) if err != nil { @@ -447,8 +445,7 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) (_err *DecodeError) { val.SetBool(b) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: if nullOK && dec.peekRuneType() == jsonparse.RuneTypeNullN { - dec.decodeNull() - return + return dec.decodeNull() } var buf strings.Builder dec.scanNumber(typ, &buf) @@ -459,8 +456,7 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) (_err *DecodeError) { val.SetInt(n) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: if nullOK && dec.peekRuneType() == jsonparse.RuneTypeNullN { - dec.decodeNull() - return + return dec.decodeNull() } var buf strings.Builder dec.scanNumber(typ, &buf) @@ -471,8 +467,7 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) (_err *DecodeError) { val.SetUint(n) case reflect.Float32, reflect.Float64: if nullOK && dec.peekRuneType() == jsonparse.RuneTypeNullN { - dec.decodeNull() - return + return dec.decodeNull() } var buf strings.Builder dec.scanNumber(typ, &buf) @@ -483,8 +478,7 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) (_err *DecodeError) { val.SetFloat(n) case reflect.String: if nullOK && dec.peekRuneType() == jsonparse.RuneTypeNullN { - dec.decodeNull() - return + return dec.decodeNull() } var buf strings.Builder if typ == numberType { @@ -537,7 +531,9 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) (_err *DecodeError) { // Couldn't get type information from a pointer; fall back to untyped mode. switch dec.peekRuneType() { case jsonparse.RuneTypeNullN: - dec.decodeNull() + if err := dec.decodeNull(); err != nil { + return err + } val.Set(reflect.Zero(typ)) default: v, err := dec.decodeAny() @@ -548,8 +544,7 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) (_err *DecodeError) { } case reflect.Struct: if nullOK && dec.peekRuneType() == jsonparse.RuneTypeNullN { - dec.decodeNull() - return + return dec.decodeNull() } index := jsonstruct.IndexStruct(typ) var nameBuf strings.Builder @@ -603,7 +598,9 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) (_err *DecodeError) { if field.Quote { switch t := dec.peekRuneType(); t { case jsonparse.RuneTypeNullN: - dec.decodeNull() + if err := dec.decodeNull(); err != nil { + return err + } switch fVal.Kind() { // XXX: I can't justify this list, other than "it's what encoding/json // does, but I don't understand their rationale". @@ -636,7 +633,9 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) (_err *DecodeError) { case reflect.Map: switch t := dec.peekRuneType(); t { case jsonparse.RuneTypeNullN: - dec.decodeNull() + if err := dec.decodeNull(); err != nil { + return err + } val.Set(reflect.Zero(typ)) case jsonparse.RuneTypeObjectBeg: if val.IsNil() { @@ -703,7 +702,9 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) (_err *DecodeError) { reflect.PointerTo(typ.Elem()).Implements(textUnmarshalerType))): switch t := dec.peekRuneType(); t { case jsonparse.RuneTypeNullN: - dec.decodeNull() + if err := dec.decodeNull(); err != nil { + return err + } val.Set(reflect.Zero(typ)) case jsonparse.RuneTypeStringBeg: if typ.Elem() == byteType { @@ -727,7 +728,9 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) (_err *DecodeError) { default: switch t := dec.peekRuneType(); t { case jsonparse.RuneTypeNullN: - dec.decodeNull() + if err := dec.decodeNull(); err != nil { + return err + } val.Set(reflect.Zero(typ)) case jsonparse.RuneTypeArrayBeg: if val.IsNil() { @@ -756,8 +759,7 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) (_err *DecodeError) { } case reflect.Array: if nullOK && dec.peekRuneType() == jsonparse.RuneTypeNullN { - dec.decodeNull() - return + return dec.decodeNull() } i := 0 n := val.Len() @@ -786,7 +788,9 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) (_err *DecodeError) { case reflect.Pointer: switch dec.peekRuneType() { case jsonparse.RuneTypeNullN: - dec.decodeNull() + if err := dec.decodeNull(); err != nil { + return err + } val.Set(reflect.Zero(typ)) default: if val.IsNil() { @@ -888,8 +892,7 @@ func (dec *Decoder) decodeAny() (any, *DecodeError) { case 't', 'f': return dec.decodeBool(nil) case 'n': - dec.decodeNull() - return nil, nil + return nil, dec.decodeNull() default: panic("should not happen") } @@ -1169,9 +1172,10 @@ func (dec *Decoder) decodeBool(gTyp reflect.Type) (bool, *DecodeError) { } } -func (dec *Decoder) decodeNull() { +func (dec *Decoder) decodeNull() *DecodeError { dec.expectRune('n', jsonparse.RuneTypeNullN) dec.expectRune('u', jsonparse.RuneTypeNullU) dec.expectRune('l', jsonparse.RuneTypeNullL1) dec.expectRune('l', jsonparse.RuneTypeNullL2) + return nil } -- cgit v1.2.3-2-g168b