diff --git a/buffer/stream.go b/buffer/stream.go new file mode 100644 index 0000000..f274a93 --- /dev/null +++ b/buffer/stream.go @@ -0,0 +1,37 @@ +package buffer + +import ( + "bytes" + "io" + "unicode/utf8" +) + +type ( + StreamBuffer struct { + input io.Reader + } +) + +func NewStreamBuffer(input io.Reader) *StreamBuffer { + return &StreamBuffer{ + input: input, + } +} + +func (b *StreamBuffer) Next() rune { + var ( + buf bytes.Buffer + ) + for { + rbuf := make([]byte, 1) + if n, err := b.input.Read(rbuf); n != 1 || err != nil { + return 0 + } + buf.Write(rbuf) + if ok := utf8.FullRune(buf.Bytes()); ok { + r, _ := utf8.DecodeRune(buf.Bytes()) + return r + } + } + return 0 +} diff --git a/parser/parser.go b/parser/parser.go index bc07239..de62d96 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -20,8 +20,7 @@ type ( ) // Creates a new parser -func New(b []byte, sels []string) *Parser { - buf := buffer.NewDataBuffer(b) +func New(buf buffer.Bufferer, sels []string) *Parser { return &Parser{ lex: lexer.New(buf), ctx: &context{ diff --git a/run.go b/run.go index 3b7d372..b010fe4 100644 --- a/run.go +++ b/run.go @@ -1,18 +1,19 @@ package main import ( - "io/ioutil" "os" "github.com/kr/pretty" + "github.com/localhots/punk/buffer" "github.com/localhots/punk/parser" ) func main() { f, _ := os.Open("test.json") - b, _ := ioutil.ReadAll(f) + // b, _ := ioutil.ReadAll(f) + buf := buffer.NewStreamBuffer(f) - p := parser.New(b, []string{ + p := parser.New(buf, []string{ "/prices/*", "/bananas/[*]/weight", })