diff options
author | Luke Shumaker <lukeshu@datawire.io> | 2022-08-16 21:50:07 -0600 |
---|---|---|
committer | Luke Shumaker <lukeshu@datawire.io> | 2022-08-17 00:34:48 -0600 |
commit | 111cdaffb625f7db9b8c5a27e386999944346e0d (patch) | |
tree | cdb6493361b4343cd2cb05ef76b77cfc5a682a1b /reencode.go | |
parent | 0e6d82b97165e9cdd294aaeac02bbbf26263877a (diff) |
Fix those now-failing error checks
Diffstat (limited to 'reencode.go')
-rw-r--r-- | reencode.go | 40 |
1 files changed, 32 insertions, 8 deletions
diff --git a/reencode.go b/reencode.go index 1e5f5aa..7c5ce52 100644 --- a/reencode.go +++ b/reencode.go @@ -5,7 +5,6 @@ package lowmemjson import ( - "errors" "fmt" "io" "unicode/utf8" @@ -16,6 +15,8 @@ type reencodeState func(rune) error type ReEncoder struct { Out io.Writer + AllowMultipleValues bool + // Whether to minify the JSON. Compact bool // String to use to indent; ignored if Compact is true. @@ -83,13 +84,22 @@ func (enc *ReEncoder) Close() error { } } if _, err := enc.par.HandleEOF(); err != nil { - enc.err = err + enc.err = &ReEncodeSyntaxError{ + Err: err, + Offset: enc.inputPos, + } return enc.err } if err := enc.handleRune(0, 0); err != nil { - enc.err = err + enc.err = &ReEncodeSyntaxError{ + Err: err, + Offset: enc.inputPos, + } return enc.err } + if enc.AllowMultipleValues { + enc.par.Reset() + } return nil } @@ -97,22 +107,36 @@ func (enc *ReEncoder) WriteRune(c rune) (n int, err error) { if enc.err != nil { return 0, enc.err } - if enc.bufLen != 0 { - enc.err = errors.New("lowmemjson.ReEncoder: cannot .WriteRune() when there is a partial rune that has been .Write()n") + if enc.bufLen > 0 { + enc.err = fmt.Errorf("lowmemjson.ReEncoder: cannot .WriteRune() when there is a partial rune that has been .Write()en: %q", enc.buf[:enc.bufLen]) return 0, enc.err } + enc.written = 0 + +rehandle: t, err := enc.par.HandleRune(c) if err != nil { enc.err = &ReEncodeSyntaxError{ Err: err, Offset: enc.inputPos, } - return 0, enc.err + return enc.written, enc.err } - - enc.written = 0 enc.err = enc.handleRune(c, t) + if enc.err == nil && t == RuneTypeEOF { + if enc.AllowMultipleValues { + enc.par.Reset() + goto rehandle + } else { + enc.err = &ReEncodeSyntaxError{ + Err: fmt.Errorf("invalid character %q after top-level value", c), + Offset: enc.inputPos, + } + return enc.written, enc.err + } + } + enc.inputPos += int64(utf8.RuneLen(c)) return enc.written, enc.err } |