summaryrefslogtreecommitdiff
path: root/decode.go
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2023-02-18 21:57:39 -0700
committerLuke Shumaker <lukeshu@lukeshu.com>2023-02-18 22:45:39 -0700
commitedfc7aa91b542978ce28eb109b99a257650b62b4 (patch)
tree3bc300355b7843a2c2ba3a0ec5db4346cdc87965 /decode.go
parentcf75ff06887d7bbb5bbbd682587b9d3f5e474670 (diff)
decode_scan, jsonparse: Rework the behavior to make a bit more sense
- decode_scan: Don't have .Reset() re-play an erroring rune - decode_Scan: Have RuneTypeEOF always be zero-width - jsonparse: Don't replace syntax errors with RuneTypeEOF if there's no barrier
Diffstat (limited to 'decode.go')
-rw-r--r--decode.go18
1 files changed, 8 insertions, 10 deletions
diff --git a/decode.go b/decode.go
index 8514ec4..491971a 100644
--- a/decode.go
+++ b/decode.go
@@ -207,19 +207,17 @@ func (dec *Decoder) DecodeThenEOF(ptr any) (err error) {
if err := dec.Decode(ptr); err != nil {
return err
}
- c, s, t, _ := dec.io.ReadRuneType()
- if t != jsonparse.RuneTypeEOF {
- panic(fmt.Errorf("should not happen: .ReadRuneType returned non-EOF after decode without .Reset being called: %v", t))
- }
- if s > 0 {
+ _, _, t, err := dec.io.ReadRuneType()
+ switch t {
+ case jsonparse.RuneTypeError:
return &DecodeError{
- Err: &DecodeSyntaxError{
- Err: fmt.Errorf("invalid character %q after top-level value", c),
- Offset: dec.InputOffset(),
- },
+ Err: err,
}
+ case jsonparse.RuneTypeEOF:
+ return nil
+ default:
+ panic(fmt.Errorf("should not happen: .ReadRuneType returned non-error non-EOF after decode without .Reset being called: '%v'", t))
}
- return nil
}
// Decode reads the next JSON element from the Decoder's input stream