package parser
import (
"fmt"
"github.com/go-pg/pg/internal"
)
type StreamingParser struct {
internal.Reader
}
func NewStreamingParser(rd internal.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() ([]byte, error) {
var b []byte
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
}
if c == '\'' {
if next == '\'' {
b = append(b, '\'')
c, err = p.ReadByte()
if err != nil {
return nil, err
}
} else {
b = append(b, c)
c = next
}
continue
}
b = append(b, c)
c = next
}
}