summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2023-02-10 18:36:36 -0700
committerLuke Shumaker <lukeshu@lukeshu.com>2023-02-10 21:49:02 -0700
commit46f143c7336f723ce5ba9bda5d78f11b19efda4f (patch)
treedd105abd15dbdd63b6d5db74b18b0cd7f8719f16
parent3aa6f66af3ceff7e0d9044678dbf1edeec1bc09d (diff)
decode: Have .decodeNull() return a *DecodeError
-rw-r--r--decode.go54
1 files changed, 29 insertions, 25 deletions
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
}