summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2023-01-30 11:42:51 -0700
committerLuke Shumaker <lukeshu@lukeshu.com>2023-01-30 22:00:25 -0700
commitbc1bacc410ddfa444c5bf0e56f33a7da440658ae (patch)
tree53d982348637d4f7e1ffffe89a69105ec350df6e
parent659114fee7c39f06c408135169f2848a881dfe5e (diff)
decode: Inline noWsRuneTypeScanner into runeTypeScannerImpl
-rw-r--r--decode.go10
-rw-r--r--decode_scan.go37
-rw-r--r--decode_scan_test.go113
3 files changed, 30 insertions, 130 deletions
diff --git a/decode.go b/decode.go
index 91be865..8fab267 100644
--- a/decode.go
+++ b/decode.go
@@ -104,12 +104,10 @@ const maxNestingDepth = 10000
// an io.Reader.
func NewDecoder(r io.RuneScanner) *Decoder {
return &Decoder{
- io: &noWSRuneTypeScanner{
- inner: &runeTypeScannerImpl{
- inner: r,
- parser: internal.Parser{
- MaxDepth: maxNestingDepth,
- },
+ io: &runeTypeScannerImpl{
+ inner: r,
+ parser: internal.Parser{
+ MaxDepth: maxNestingDepth,
},
},
}
diff --git a/decode_scan.go b/decode_scan.go
index 387fcea..261aaa6 100644
--- a/decode_scan.go
+++ b/decode_scan.go
@@ -77,6 +77,7 @@ func (sc *runeTypeScannerImpl) ReadRuneType() (rune, int, internal.RuneType, err
_, _, _ = sc.inner.ReadRune()
default:
sc.initialized = true
+ again:
var err error
sc.rRune, sc.rSize, err = sc.inner.ReadRune()
sc.offset += int64(sc.rSize)
@@ -91,6 +92,9 @@ func (sc *runeTypeScannerImpl) ReadRuneType() (rune, int, internal.RuneType, err
} else {
sc.rErr = nil
}
+ if sc.rType == internal.RuneTypeSpace {
+ goto again
+ }
case io.EOF:
sc.rType, err = sc.parser.HandleEOF()
if err != nil {
@@ -147,39 +151,6 @@ func (sc *runeTypeScannerImpl) InputOffset() int64 {
return ret
}
-// noWSRuneTypeScanner /////////////////////////////////////////////////////////////////////////////
-
-type noWSRuneTypeScanner struct {
- inner runeTypeScanner
-}
-
-var _ runeTypeScanner = (*noWSRuneTypeScanner)(nil)
-
-func (sc *noWSRuneTypeScanner) ReadRuneType() (rune, int, internal.RuneType, error) {
-again:
- r, s, t, e := sc.inner.ReadRuneType()
- if t == internal.RuneTypeSpace {
- goto again
- }
- return r, s, t, e
-}
-
-func (sc *noWSRuneTypeScanner) ReadRune() (rune, int, error) {
- r, s, t, e := sc.ReadRuneType()
- switch t {
- case internal.RuneTypeEOF:
- return 0, 0, io.EOF
- case internal.RuneTypeError:
- return 0, 0, e
- default:
- return r, s, nil
- }
-}
-
-func (sc *noWSRuneTypeScanner) UnreadRune() error { return sc.inner.UnreadRune() }
-func (sc *noWSRuneTypeScanner) Reset() { sc.inner.Reset() }
-func (sc *noWSRuneTypeScanner) InputOffset() int64 { return sc.inner.InputOffset() }
-
// elemRuneTypeScanner /////////////////////////////////////////////////////////////////////////////
type elemRuneTypeScanner struct {
diff --git a/decode_scan_test.go b/decode_scan_test.go
index 6a430ab..5bf5e2a 100644
--- a/decode_scan_test.go
+++ b/decode_scan_test.go
@@ -69,7 +69,6 @@ func TestRuneTypeScanner(t *testing.T) {
{'o', 1, internal.RuneTypeStringChar, nil},
{'"', 1, internal.RuneTypeStringEnd, nil},
{':', 1, internal.RuneTypeObjectColon, nil},
- {' ', 1, internal.RuneTypeSpace, nil},
{'1', 1, internal.RuneTypeNumberIntDig, nil},
{'2', 1, internal.RuneTypeNumberIntDig, nil},
{'.', 1, internal.RuneTypeNumberFracDot, nil},
@@ -86,7 +85,6 @@ func TestRuneTypeScanner(t *testing.T) {
{'o', 1, internal.RuneTypeStringChar, nil},
{'"', 1, internal.RuneTypeStringEnd, nil},
{':', 1, internal.RuneTypeObjectColon, nil},
- {' ', 1, internal.RuneTypeSpace, nil},
{'1', 1, internal.RuneTypeNumberIntDig, nil},
{0, -1, 0, nil},
{'1', 1, internal.RuneTypeNumberIntDig, nil},
@@ -105,7 +103,6 @@ func TestRuneTypeScanner(t *testing.T) {
{'o', 1, internal.RuneTypeStringChar, nil},
{'"', 1, internal.RuneTypeStringEnd, nil},
{':', 1, internal.RuneTypeObjectColon, nil},
- {' ', 1, internal.RuneTypeSpace, nil},
{'1', 1, internal.RuneTypeNumberIntDig, nil},
{0, -1, 0, nil},
{0, -1, 0, ErrInvalidUnreadRune},
@@ -125,7 +122,6 @@ func TestRuneTypeScanner(t *testing.T) {
{'o', 1, internal.RuneTypeStringChar, nil},
{'"', 1, internal.RuneTypeStringEnd, nil},
{':', 1, internal.RuneTypeObjectColon, nil},
- {' ', 1, internal.RuneTypeSpace, nil},
{'1', 1, internal.RuneTypeNumberIntDig, nil},
{'2', 1, internal.RuneTypeNumberIntDig, nil},
{'.', 1, internal.RuneTypeNumberFracDot, nil},
@@ -136,44 +132,7 @@ func TestRuneTypeScanner(t *testing.T) {
{0, 0, internal.RuneTypeEOF, nil},
{0, 0, internal.RuneTypeEOF, nil},
}},
- "syntax-error": {`[[0,]`, ``, []ReadRuneTypeResult{
- {'[', 1, internal.RuneTypeArrayBeg, nil},
- {'[', 1, internal.RuneTypeArrayBeg, nil},
- {'0', 1, internal.RuneTypeNumberIntZero, nil},
- {',', 1, internal.RuneTypeArrayComma, nil},
- {']', 1, internal.RuneTypeError, &DecodeSyntaxError{Offset: 4, Err: fmt.Errorf("invalid character %q looking for beginning of value", ']')}},
- {']', 1, internal.RuneTypeError, &DecodeSyntaxError{Offset: 4, Err: fmt.Errorf("invalid character %q looking for beginning of value", ']')}},
- {']', 1, internal.RuneTypeError, &DecodeSyntaxError{Offset: 4, Err: fmt.Errorf("invalid character %q looking for beginning of value", ']')}},
- }},
- "multi-value": {`1{}`, `}`, []ReadRuneTypeResult{
- {'1', 1, internal.RuneTypeNumberIntDig, nil},
- {'{', 1, internal.RuneTypeEOF, nil},
- {'{', 1, internal.RuneTypeEOF, nil},
- {'{', 1, internal.RuneTypeEOF, nil},
- }},
- "early-eof": {`{`, ``, []ReadRuneTypeResult{
- {'{', 1, internal.RuneTypeObjectBeg, nil},
- {0, 0, internal.RuneTypeError, &DecodeSyntaxError{Offset: 1, Err: io.ErrUnexpectedEOF}},
- {0, 0, internal.RuneTypeError, &DecodeSyntaxError{Offset: 1, Err: io.ErrUnexpectedEOF}},
- {0, 0, internal.RuneTypeError, &DecodeSyntaxError{Offset: 1, Err: io.ErrUnexpectedEOF}},
- }},
- "empty": {``, ``, []ReadRuneTypeResult{
- {0, 0, internal.RuneTypeError, &DecodeSyntaxError{Offset: 0, Err: io.EOF}},
- {0, 0, internal.RuneTypeError, &DecodeSyntaxError{Offset: 0, Err: io.EOF}},
- {0, 0, internal.RuneTypeError, &DecodeSyntaxError{Offset: 0, Err: io.EOF}},
- }},
- }
- testRuneTypeScanner(t, testcases, func(reader io.RuneScanner) runeTypeScanner {
- return &runeTypeScannerImpl{
- inner: reader,
- }
- })
-}
-
-func TestNoWSRuneTypeScanner(t *testing.T) {
- t.Parallel()
- testcases := map[string]runeTypeScannerTestcase{
- "basic": {`{"foo": 12.0}`, ``, []ReadRuneTypeResult{
+ "tail-ws": {`{"foo": 12.0} `, ``, []ReadRuneTypeResult{
{'{', 1, internal.RuneTypeObjectBeg, nil},
{'"', 1, internal.RuneTypeStringBeg, nil},
{'f', 1, internal.RuneTypeStringChar, nil},
@@ -189,39 +148,14 @@ func TestNoWSRuneTypeScanner(t *testing.T) {
{0, 0, internal.RuneTypeEOF, nil},
{0, 0, internal.RuneTypeEOF, nil},
}},
- "unread": {`{"foo": 12.0}`, ``, []ReadRuneTypeResult{
- {'{', 1, internal.RuneTypeObjectBeg, nil},
- {'"', 1, internal.RuneTypeStringBeg, nil},
- {'f', 1, internal.RuneTypeStringChar, nil},
- {'o', 1, internal.RuneTypeStringChar, nil},
- {'o', 1, internal.RuneTypeStringChar, nil},
- {'"', 1, internal.RuneTypeStringEnd, nil},
- {':', 1, internal.RuneTypeObjectColon, nil},
- {'1', 1, internal.RuneTypeNumberIntDig, nil},
- {0, -1, 0, nil},
- {'1', 1, internal.RuneTypeNumberIntDig, nil},
- {'2', 1, internal.RuneTypeNumberIntDig, nil},
- {'.', 1, internal.RuneTypeNumberFracDot, nil},
- {'0', 1, internal.RuneTypeNumberFracDig, nil},
- {'}', 1, internal.RuneTypeObjectEnd, nil},
- {0, 0, internal.RuneTypeEOF, nil},
- {0, 0, internal.RuneTypeEOF, nil},
- }},
- "tail": {`{"foo": 12.0} `, ``, []ReadRuneTypeResult{
- {'{', 1, internal.RuneTypeObjectBeg, nil},
- {'"', 1, internal.RuneTypeStringBeg, nil},
- {'f', 1, internal.RuneTypeStringChar, nil},
- {'o', 1, internal.RuneTypeStringChar, nil},
- {'o', 1, internal.RuneTypeStringChar, nil},
- {'"', 1, internal.RuneTypeStringEnd, nil},
- {':', 1, internal.RuneTypeObjectColon, nil},
- {'1', 1, internal.RuneTypeNumberIntDig, nil},
- {'2', 1, internal.RuneTypeNumberIntDig, nil},
- {'.', 1, internal.RuneTypeNumberFracDot, nil},
- {'0', 1, internal.RuneTypeNumberFracDig, nil},
- {'}', 1, internal.RuneTypeObjectEnd, nil},
- {0, 0, internal.RuneTypeEOF, nil},
- {0, 0, internal.RuneTypeEOF, nil},
+ "syntax-error": {`[[0,]`, ``, []ReadRuneTypeResult{
+ {'[', 1, internal.RuneTypeArrayBeg, nil},
+ {'[', 1, internal.RuneTypeArrayBeg, nil},
+ {'0', 1, internal.RuneTypeNumberIntZero, nil},
+ {',', 1, internal.RuneTypeArrayComma, nil},
+ {']', 1, internal.RuneTypeError, &DecodeSyntaxError{Offset: 4, Err: fmt.Errorf("invalid character %q looking for beginning of value", ']')}},
+ {']', 1, internal.RuneTypeError, &DecodeSyntaxError{Offset: 4, Err: fmt.Errorf("invalid character %q looking for beginning of value", ']')}},
+ {']', 1, internal.RuneTypeError, &DecodeSyntaxError{Offset: 4, Err: fmt.Errorf("invalid character %q looking for beginning of value", ']')}},
}},
"multi-value": {`1{}`, `}`, []ReadRuneTypeResult{
{'1', 1, internal.RuneTypeNumberIntDig, nil},
@@ -235,12 +169,15 @@ func TestNoWSRuneTypeScanner(t *testing.T) {
{0, 0, internal.RuneTypeError, &DecodeSyntaxError{Offset: 2, Err: io.ErrUnexpectedEOF}},
{0, 0, internal.RuneTypeError, &DecodeSyntaxError{Offset: 2, Err: io.ErrUnexpectedEOF}},
}},
+ "empty": {``, ``, []ReadRuneTypeResult{
+ {0, 0, internal.RuneTypeError, &DecodeSyntaxError{Offset: 0, Err: io.EOF}},
+ {0, 0, internal.RuneTypeError, &DecodeSyntaxError{Offset: 0, Err: io.EOF}},
+ {0, 0, internal.RuneTypeError, &DecodeSyntaxError{Offset: 0, Err: io.EOF}},
+ }},
}
testRuneTypeScanner(t, testcases, func(reader io.RuneScanner) runeTypeScanner {
- return &noWSRuneTypeScanner{
- inner: &runeTypeScannerImpl{
- inner: reader,
- },
+ return &runeTypeScannerImpl{
+ inner: reader,
}
})
}
@@ -301,10 +238,8 @@ func TestElemRuneTypeScanner(t *testing.T) {
t.Parallel()
testRuneTypeScanner(t, toplevelTestcases, func(reader io.RuneScanner) runeTypeScanner {
return &elemRuneTypeScanner{
- inner: &noWSRuneTypeScanner{
- inner: &runeTypeScannerImpl{
- inner: reader,
- },
+ inner: &runeTypeScannerImpl{
+ inner: reader,
},
}
})
@@ -312,10 +247,8 @@ func TestElemRuneTypeScanner(t *testing.T) {
t.Run("child", func(t *testing.T) {
t.Parallel()
testRuneTypeScanner(t, childTestcases, func(reader io.RuneScanner) runeTypeScanner {
- inner := &noWSRuneTypeScanner{
- inner: &runeTypeScannerImpl{
- inner: reader,
- },
+ inner := &runeTypeScannerImpl{
+ inner: reader,
}
var res ReadRuneTypeResult
res.r, res.s, res.t, res.e = inner.ReadRuneType()
@@ -332,10 +265,8 @@ func TestElemRuneTypeScanner(t *testing.T) {
func TestElemRuneTypeScanner2(t *testing.T) {
t.Parallel()
- parent := &noWSRuneTypeScanner{
- inner: &runeTypeScannerImpl{
- inner: strings.NewReader(` { "foo" : 12.0 } `),
- },
+ parent := &runeTypeScannerImpl{
+ inner: strings.NewReader(` { "foo" : 12.0 } `),
}
exp := []ReadRuneTypeResult{
{'{', 1, internal.RuneTypeObjectBeg, nil},