summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2023-02-23 18:18:53 -0700
committerLuke Shumaker <lukeshu@lukeshu.com>2023-02-23 18:18:59 -0700
commitd8a66ffc3907f1fa6d67dcc65f2d688c8b27b71c (patch)
treeea77d14fca2f48a21500e74fa9a081eaf89a1edc
parenta10285f9436f6e5372bcba1789348f1cc2794d9b (diff)
decode: Rename expectRune→expectRuneOrPanic, add a doc comment
-rw-r--r--decode.go38
1 files 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