Skip to content

Commit

Permalink
create scan package
Browse files Browse the repository at this point in the history
  • Loading branch information
awalterschulze committed Feb 4, 2025
1 parent 243ea54 commit 2317ce0
Show file tree
Hide file tree
Showing 6 changed files with 79 additions and 61 deletions.
8 changes: 0 additions & 8 deletions json/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@ var errLongBuffer = errors.New("json is complete, but buffer is still has more t
// errUnquote returns an error that resulted from trying to unquote a string.
var errUnquote = errors.New("unable to unquote string")

var errScanString = errors.New("unable to scan string")

var errExpectedOpenCurly = errors.New("expected '{'")

var errExpectedOpenBracket = errors.New("expected '['")
Expand All @@ -37,12 +35,6 @@ var errExpectedColon = errors.New("expected ':'")

var errExpectedValue = errors.New("expected a json value")

var errExpectedNull = errors.New("expected null")

var errExpectedFalse = errors.New("expected false")

var errExpectedTrue = errors.New("expected true")

var errExpectedCommaOrCloseCurly = errors.New("expected ',' or '}'")

var errExpectedCommaOrCloseBracket = errors.New("expected ',' or ']'")
Expand Down
47 changes: 46 additions & 1 deletion json/json.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,54 @@ import (
"github.com/katydid/parser-go-json/json/internal/fork/strconv"
"github.com/katydid/parser-go-json/json/internal/fork/unquote"
"github.com/katydid/parser-go-json/json/internal/pool"
"github.com/katydid/parser-go-json/json/scan"
"github.com/katydid/parser-go/parser"
)

func (s *jsonParser) scanTrue() error {
n, err := scan.True(s.buf[s.offset:])
if err != nil {
return err
}
if err := s.incOffset(n); err != nil {
return err
}
return s.skipSpace()
}

func (s *jsonParser) scanFalse() error {
n, err := scan.False(s.buf[s.offset:])
if err != nil {
return err
}
if err := s.incOffset(n); err != nil {
return err
}
return s.skipSpace()
}

func (s *jsonParser) scanNull() error {
n, err := scan.Null(s.buf[s.offset:])
if err != nil {
return err
}
if err := s.incOffset(n); err != nil {
return err
}
return s.skipSpace()
}

func (s *jsonParser) scanString() error {
n, err := scan.String(s.buf[s.offset:])
if err != nil {
return err
}
if err := s.incOffset(n); err != nil {
return err
}
return s.skipSpace()
}

func unquoteBytes(pool pool.Pool, s []byte) (string, error) {
var ok bool
var t string
Expand Down Expand Up @@ -82,7 +127,7 @@ func (s *jsonParser) skipSpace() error {
if s.offset >= len(s.buf) {
return nil
}
n := skipSpace(s.buf[s.offset:])
n := scan.Space(s.buf[s.offset:])
if err := s.incOffset(n); err != nil {
return err
}
Expand Down
41 changes: 4 additions & 37 deletions json/scan_const.go → json/scan/const.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.

package json
package scan

import "bytes"

Expand All @@ -28,51 +28,18 @@ func scanConst(buf []byte, valBytes []byte, err error) (int, error) {

var trueBytes = []byte{'t', 'r', 'u', 'e'}

func scanTrue(buf []byte) (int, error) {
func True(buf []byte) (int, error) {
return scanConst(buf, trueBytes, errExpectedTrue)
}

func (s *jsonParser) scanTrue() error {
n, err := scanTrue(s.buf[s.offset:])
if err != nil {
return err
}
if err := s.incOffset(n); err != nil {
return err
}
return s.skipSpace()
}

var falseBytes = []byte{'f', 'a', 'l', 's', 'e'}

func scanFalse(buf []byte) (int, error) {
func False(buf []byte) (int, error) {
return scanConst(buf, falseBytes, errExpectedFalse)
}

func (s *jsonParser) scanFalse() error {
n, err := scanFalse(s.buf[s.offset:])
if err != nil {
return err
}
if err := s.incOffset(n); err != nil {
return err
}
return s.skipSpace()
}

var nullBytes = []byte{'n', 'u', 'l', 'l'}

func scanNull(buf []byte) (int, error) {
func Null(buf []byte) (int, error) {
return scanConst(buf, nullBytes, errExpectedNull)
}

func (s *jsonParser) scanNull() error {
n, err := scanNull(s.buf[s.offset:])
if err != nil {
return err
}
if err := s.incOffset(n); err != nil {
return err
}
return s.skipSpace()
}
25 changes: 25 additions & 0 deletions json/scan/errors.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// Copyright 2025 Walter Schulze
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package scan

import "errors"

var errExpectedNull = errors.New("expected null")

var errExpectedFalse = errors.New("expected false")

var errExpectedTrue = errors.New("expected true")

var errScanString = errors.New("unable to scan string")
4 changes: 2 additions & 2 deletions json/scan_space.go → json/scan/space.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@
// See the License for the specific language governing permissions and
// limitations under the License.

package json
package scan

func isSpace(c byte) bool {
return (c == ' ') || (c == '\n') || (c == '\r') || (c == '\t')
}

func skipSpace(buf []byte) int {
func Space(buf []byte) int {
for i, c := range buf {
if !isSpace(c) {
return i
Expand Down
15 changes: 2 additions & 13 deletions json/scan_string.go → json/scan/string.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@
// See the License for the specific language governing permissions and
// limitations under the License.

package json
package scan

func scanString(buf []byte) (int, error) {
func String(buf []byte) (int, error) {
escaped := false
udigits := -1
if len(buf) == 0 || buf[0] != '"' {
Expand Down Expand Up @@ -57,14 +57,3 @@ func scanString(buf []byte) (int, error) {
}
return 0, errScanString
}

func (s *jsonParser) scanString() error {
n, err := scanString(s.buf[s.offset:])
if err != nil {
return err
}
if err := s.incOffset(n); err != nil {
return err
}
return s.skipSpace()
}

0 comments on commit 2317ce0

Please sign in to comment.