summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@datawire.io>2022-08-17 00:48:11 -0600
committerLuke Shumaker <lukeshu@datawire.io>2022-08-17 00:48:11 -0600
commit6b11bd03dd572a4c1b5bb2a72da5a556c7998c56 (patch)
tree2f5dbc5dbfd88c6b2f689fcad2be9950064e7538
parent111cdaffb625f7db9b8c5a27e386999944346e0d (diff)
decode: Don't be greedy unless we're looking for EOF
-rw-r--r--decode.go33
1 files changed, 17 insertions, 16 deletions
diff --git a/decode.go b/decode.go
index 52fcb5e..9c05860 100644
--- a/decode.go
+++ b/decode.go
@@ -130,15 +130,25 @@ func DecodeThenEOF(r interface {
if err := dec.Decode(ptr); err != nil {
return err
}
- if c, _, err := r.ReadRune(); err == nil {
- return &DecodeError{
- Err: &DecodeSyntaxError{
- Err: fmt.Errorf("invalid character %q after top-level value", c),
- Offset: dec.InputOffset(),
- },
+ for {
+ c, s, t, _ := dec.io.ReadRuneType()
+ switch t {
+ case RuneTypeSpace:
+ // do nothing
+ case RuneTypeEOF:
+ if s > 0 {
+ return &DecodeError{
+ Err: &DecodeSyntaxError{
+ Err: fmt.Errorf("invalid character %q after top-level value", c),
+ Offset: dec.InputOffset(),
+ },
+ }
+ }
+ return nil
+ default:
+ panic("should not happen")
}
}
- return nil
}
func (dec *Decoder) Decode(ptr any) (err error) {
@@ -167,15 +177,6 @@ func (dec *Decoder) Decode(ptr any) (err error) {
}
}()
dec.decode(ptrVal.Elem(), false)
- for {
- _, s, t, _ := dec.io.ReadRuneType()
- if t == RuneTypeEOF || t == RuneTypeError {
- if s > 0 {
- dec.io.UnreadRune()
- }
- break
- }
- }
return nil
}