summaryrefslogtreecommitdiff
path: root/decode.go
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@datawire.io>2022-08-21 12:06:50 -0600
committerLuke Shumaker <lukeshu@datawire.io>2022-08-21 12:06:50 -0600
commit6ba16f05e9c36d4341da4590600eb2c4221ac642 (patch)
treeadccf15073073237eafc1926110fe3da46ea2aee /decode.go
parentfb063e2955debb9d02debf3f59de291d99017058 (diff)
decode: Lean in to io.RuneScanner
So that it's easier to compose your own .DecodeJSON methods, since .DecodeJSON takes an io.RuneScanner.
Diffstat (limited to 'decode.go')
-rw-r--r--decode.go19
1 files changed, 6 insertions, 13 deletions
diff --git a/decode.go b/decode.go
index 51402e7..98a0e5b 100644
--- a/decode.go
+++ b/decode.go
@@ -5,7 +5,6 @@
package lowmemjson
import (
- "bufio"
"bytes"
"encoding"
"encoding/json"
@@ -47,15 +46,11 @@ type Decoder struct {
const maxNestingDepth = 10000
-func NewDecoder(r io.Reader) *Decoder {
- rr, ok := r.(io.RuneReader)
- if !ok {
- rr = bufio.NewReader(r)
- }
+func NewDecoder(r io.RuneScanner) *Decoder {
return &Decoder{
io: &noWSRuneTypeScanner{
inner: &runeTypeScannerImpl{
- inner: rr,
+ inner: r,
parser: Parser{
MaxDepth: maxNestingDepth,
},
@@ -114,18 +109,16 @@ func (dec *Decoder) stackName() string {
return strings.Join(fields, ".")
}
-func Decode(r interface {
- io.Reader
- io.RuneScanner // enforce that the reader have .UnreadRune() so that we don't risk reading too far when decoding a number
-}, ptr any) error {
+func Decode(r io.RuneScanner, ptr any) error {
return NewDecoder(r).Decode(ptr)
}
-// DecodeThenEOF is like decode, but emits an error if there is extra data after the JSON.
-func DecodeThenEOF(r io.Reader, ptr any) error {
+func DecodeThenEOF(r io.RuneScanner, ptr any) error {
return NewDecoder(r).DecodeThenEOF(ptr)
}
+// DecodeThenEOF is like decode, but emits an error if there is extra
+// data after the JSON.
func (dec *Decoder) DecodeThenEOF(ptr any) (err error) {
if err := dec.Decode(ptr); err != nil {
return err