summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2023-02-10 18:44:18 -0700
committerLuke Shumaker <lukeshu@lukeshu.com>2023-02-10 21:49:02 -0700
commitabd63cfa18dbb5d9ef37f07442e70d2d9d9e6b49 (patch)
tree2d24b47c2de544423fc59ad350b2c4c740017cda
parent46f4b0c2a67911b7438621b6181f5888b8be55b6 (diff)
decode: Have .decodeString() return a *DecodeError
-rw-r--r--decode.go38
1 files changed, 25 insertions, 13 deletions
diff --git a/decode.go b/decode.go
index de10370..77652af 100644
--- a/decode.go
+++ b/decode.go
@@ -431,7 +431,9 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) (_err *DecodeError) {
return dec.decodeNull()
}
var buf bytes.Buffer
- dec.decodeString(reflect.PointerTo(typ), &buf)
+ if err := dec.decodeString(reflect.PointerTo(typ), &buf); err != nil {
+ return err
+ }
obj := val.Addr().Interface().(encoding.TextUnmarshaler)
if err := obj.UnmarshalText(buf.Bytes()); err != nil {
return dec.newTypeError("string", reflect.PointerTo(typ), err)
@@ -503,7 +505,9 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) (_err *DecodeError) {
}
val.SetString(buf.String())
} else {
- dec.decodeString(typ, &buf)
+ if err := dec.decodeString(typ, &buf); err != nil {
+ return err
+ }
val.SetString(buf.String())
}
case reflect.Interface:
@@ -564,8 +568,7 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) (_err *DecodeError) {
dec.posStackPush()
defer dec.posStackPop()
nameBuf.Reset()
- dec.decodeString(nil, &nameBuf)
- return nil
+ return dec.decodeString(nil, &nameBuf)
}, func() *DecodeError {
dec.posStackPush()
defer dec.posStackPop()
@@ -623,7 +626,9 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) (_err *DecodeError) {
case jsonparse.RuneTypeStringBeg:
// TODO: Figure out how to do this without buffering, have correct offsets.
var buf bytes.Buffer
- dec.decodeString(nil, &buf)
+ if err := dec.decodeString(nil, &buf); err != nil {
+ return err
+ }
if err := NewDecoder(bytes.NewReader(buf.Bytes())).Decode(fVal.Addr().Interface()); err != nil {
if str := buf.String(); str != "null" {
return dec.newTypeError("", fVal.Type(),
@@ -658,7 +663,9 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) (_err *DecodeError) {
dec.posStackPush()
defer dec.posStackPop()
nameBuf.Reset()
- dec.decodeString(nil, &nameBuf)
+ if err := dec.decodeString(nil, &nameBuf); err != nil {
+ return err
+ }
nameValTyp := typ.Key()
nameValPtr = reflect.New(nameValTyp)
switch {
@@ -720,13 +727,17 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) (_err *DecodeError) {
case jsonparse.RuneTypeStringBeg:
if typ.Elem() == byteType {
var buf bytes.Buffer
- dec.decodeString(typ, base64dec.NewBase64Decoder(&buf))
+ if err := dec.decodeString(typ, base64dec.NewBase64Decoder(&buf)); err != nil {
+ return err
+ }
val.Set(reflect.ValueOf(buf.Bytes()))
} else {
// TODO: Surely there's a better way. At the very least, we should
// avoid buffering.
var buf bytes.Buffer
- dec.decodeString(typ, base64dec.NewBase64Decoder(&buf))
+ if err := dec.decodeString(typ, base64dec.NewBase64Decoder(&buf)); err != nil {
+ return err
+ }
bs := buf.Bytes()
val.Set(reflect.MakeSlice(typ, len(bs), len(bs)))
for i := 0; i < len(bs); i++ {
@@ -850,8 +861,7 @@ func (dec *Decoder) decodeAny() (any, *DecodeError) {
dec.posStackPush()
defer dec.posStackPop()
nameBuf.Reset()
- dec.decodeString(nil, &nameBuf)
- return nil
+ return dec.decodeString(nil, &nameBuf)
}, func() *DecodeError {
dec.posStackPush()
defer dec.posStackPop()
@@ -888,7 +898,9 @@ func (dec *Decoder) decodeAny() (any, *DecodeError) {
return ret, nil
case '"':
var buf strings.Builder
- dec.decodeString(nil, &buf)
+ if err := dec.decodeString(nil, &buf); err != nil {
+ return nil, err
+ }
return buf.String(), nil
case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
var buf strings.Builder
@@ -1080,7 +1092,7 @@ func (dec *Decoder) decodeArray(gTyp reflect.Type, decodeMember func() *DecodeEr
}
}
-func (dec *Decoder) decodeString(gTyp reflect.Type, out fastio.RuneWriter) {
+func (dec *Decoder) decodeString(gTyp reflect.Type, out fastio.RuneWriter) *DecodeError {
dec.expectRuneType('"', jsonparse.RuneTypeStringBeg, gTyp)
var uhex [4]byte
for {
@@ -1161,7 +1173,7 @@ func (dec *Decoder) decodeString(gTyp reflect.Type, out fastio.RuneWriter) {
_, _ = out.WriteRune(c)
}
case jsonparse.RuneTypeStringEnd:
- return
+ return nil
default:
panic("should not happen")
}