From d8a66ffc3907f1fa6d67dcc65f2d688c8b27b71c Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Thu, 23 Feb 2023 18:18:53 -0700 Subject: =?UTF-8?q?decode:=20Rename=20expectRune=E2=86=92expectRuneOrPanic?= =?UTF-8?q?,=20add=20a=20doc=20comment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- decode.go | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/decode.go b/decode.go index a136668..10b3685 100644 --- a/decode.go +++ b/decode.go @@ -296,7 +296,13 @@ func (dec *Decoder) peekRuneType() (jsonparse.RuneType, *DecodeError) { return t, nil } -func (dec *Decoder) expectRune(ec rune, et jsonparse.RuneType) *DecodeError { +// expectRuneOrPanic is for when you *know* what the next +// non-whitespace rune is going to be; for it to be anything else +// would be a syntax error. It will return an error for I/O errors +// and syntax errors, but panic if the result is not what was +// expected; as that would indicate a bug in the agreement between the +// parser and the decoder. +func (dec *Decoder) expectRuneOrPanic(ec rune, et jsonparse.RuneType) *DecodeError { ac, at, err := dec.readRune() if err != nil { return err @@ -1042,7 +1048,7 @@ func (dec *Decoder) decodeObject(gTyp reflect.Type, decodeKey, decodeVal func() if err := decodeKey(); err != nil { return err } - if err := dec.expectRune(':', jsonparse.RuneTypeObjectColon); err != nil { + if err := dec.expectRuneOrPanic(':', jsonparse.RuneTypeObjectColon); err != nil { return err } if err := decodeVal(); err != nil { @@ -1054,7 +1060,7 @@ func (dec *Decoder) decodeObject(gTyp reflect.Type, decodeKey, decodeVal func() } switch t { case jsonparse.RuneTypeObjectComma: - if err := dec.expectRune('"', jsonparse.RuneTypeStringBeg); err != nil { + if err := dec.expectRuneOrPanic('"', jsonparse.RuneTypeStringBeg); err != nil { return err } goto decodeMember @@ -1195,7 +1201,7 @@ func (dec *Decoder) decodeString(gTyp reflect.Type, out fastio.RuneWriter) *Deco _, _ = out.WriteRune(utf8.RuneError) break } - if err := dec.expectRune('\\', jsonparse.RuneTypeStringEsc); err != nil { + if err := dec.expectRuneOrPanic('\\', jsonparse.RuneTypeStringEsc); err != nil { return err } t, err = dec.peekRuneType() @@ -1206,7 +1212,7 @@ func (dec *Decoder) decodeString(gTyp reflect.Type, out fastio.RuneWriter) *Deco _, _ = out.WriteRune(utf8.RuneError) break } - if err := dec.expectRune('u', jsonparse.RuneTypeStringEscU); err != nil { + if err := dec.expectRuneOrPanic('u', jsonparse.RuneTypeStringEscU); err != nil { return err } @@ -1255,27 +1261,27 @@ func (dec *Decoder) decodeBool(gTyp reflect.Type) (bool, *DecodeError) { } switch c { case 't': - if err := dec.expectRune('r', jsonparse.RuneTypeTrueR); err != nil { + if err := dec.expectRuneOrPanic('r', jsonparse.RuneTypeTrueR); err != nil { return false, err } - if err := dec.expectRune('u', jsonparse.RuneTypeTrueU); err != nil { + if err := dec.expectRuneOrPanic('u', jsonparse.RuneTypeTrueU); err != nil { return false, err } - if err := dec.expectRune('e', jsonparse.RuneTypeTrueE); err != nil { + if err := dec.expectRuneOrPanic('e', jsonparse.RuneTypeTrueE); err != nil { return false, err } return true, nil case 'f': - if err := dec.expectRune('a', jsonparse.RuneTypeFalseA); err != nil { + if err := dec.expectRuneOrPanic('a', jsonparse.RuneTypeFalseA); err != nil { return false, err } - if err := dec.expectRune('l', jsonparse.RuneTypeFalseL); err != nil { + if err := dec.expectRuneOrPanic('l', jsonparse.RuneTypeFalseL); err != nil { return false, err } - if err := dec.expectRune('s', jsonparse.RuneTypeFalseS); err != nil { + if err := dec.expectRuneOrPanic('s', jsonparse.RuneTypeFalseS); err != nil { return false, err } - if err := dec.expectRune('e', jsonparse.RuneTypeFalseE); err != nil { + if err := dec.expectRuneOrPanic('e', jsonparse.RuneTypeFalseE); err != nil { return false, err } return false, nil @@ -1285,16 +1291,16 @@ func (dec *Decoder) decodeBool(gTyp reflect.Type) (bool, *DecodeError) { } func (dec *Decoder) decodeNull() *DecodeError { - if err := dec.expectRune('n', jsonparse.RuneTypeNullN); err != nil { + if err := dec.expectRuneOrPanic('n', jsonparse.RuneTypeNullN); err != nil { return err } - if err := dec.expectRune('u', jsonparse.RuneTypeNullU); err != nil { + if err := dec.expectRuneOrPanic('u', jsonparse.RuneTypeNullU); err != nil { return err } - if err := dec.expectRune('l', jsonparse.RuneTypeNullL1); err != nil { + if err := dec.expectRuneOrPanic('l', jsonparse.RuneTypeNullL1); err != nil { return err } - if err := dec.expectRune('l', jsonparse.RuneTypeNullL2); err != nil { + if err := dec.expectRuneOrPanic('l', jsonparse.RuneTypeNullL2); err != nil { return err } return nil -- cgit v1.2.3