diff options
Diffstat (limited to 'vendor/github.com/go-pg/pg/v10/internal/parser/streaming_parser.go')
-rw-r--r-- | vendor/github.com/go-pg/pg/v10/internal/parser/streaming_parser.go | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/vendor/github.com/go-pg/pg/v10/internal/parser/streaming_parser.go b/vendor/github.com/go-pg/pg/v10/internal/parser/streaming_parser.go new file mode 100644 index 000000000..723c12b16 --- /dev/null +++ b/vendor/github.com/go-pg/pg/v10/internal/parser/streaming_parser.go @@ -0,0 +1,65 @@ +package parser + +import ( + "fmt" + + "github.com/go-pg/pg/v10/internal/pool" +) + +type StreamingParser struct { + pool.Reader +} + +func NewStreamingParser(rd pool.Reader) StreamingParser { + return StreamingParser{ + Reader: rd, + } +} + +func (p StreamingParser) SkipByte(skip byte) error { + c, err := p.ReadByte() + if err != nil { + return err + } + if c == skip { + return nil + } + _ = p.UnreadByte() + return fmt.Errorf("got %q, wanted %q", c, skip) +} + +func (p StreamingParser) ReadSubstring(b []byte) ([]byte, error) { + c, err := p.ReadByte() + if err != nil { + return b, err + } + + for { + if c == '"' { + return b, nil + } + + next, err := p.ReadByte() + if err != nil { + return b, err + } + + if c == '\\' { + switch next { + case '\\', '"': + b = append(b, next) + c, err = p.ReadByte() + if err != nil { + return nil, err + } + default: + b = append(b, '\\') + c = next + } + continue + } + + b = append(b, c) + c = next + } +} |