From abd63cfa18dbb5d9ef37f07442e70d2d9d9e6b49 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Fri, 10 Feb 2023 18:44:18 -0700 Subject: decode: Have .decodeString() return a *DecodeError --- decode.go | 38 +++++++++++++++++++++++++------------- 1 file 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") } -- cgit v1.2.3-2-g168b