github.com/urso/go-structform@v0.0.2/ubjson/decode.go (about) 1 package ubjson 2 3 import ( 4 "io" 5 6 structform "github.com/urso/go-structform" 7 ) 8 9 type Decoder struct { 10 p Parser 11 12 buffer []byte 13 buffer0 []byte 14 in io.Reader 15 } 16 17 func NewDecoder(in io.Reader, buffer int, vs structform.Visitor) *Decoder { 18 dec := &Decoder{ 19 buffer0: make([]byte, buffer), 20 in: in, 21 } 22 dec.p.init(vs) 23 return dec 24 } 25 26 func NewBytesDecoder(b []byte, vs structform.Visitor) *Decoder { 27 dec := &Decoder{ 28 buffer: b, 29 buffer0: b[:0], 30 in: nil, 31 } 32 dec.p.init(vs) 33 return dec 34 } 35 36 func (dec *Decoder) Next() error { 37 var ( 38 n int 39 err error 40 reported bool 41 ) 42 43 for !reported { 44 if len(dec.buffer) == 0 { 45 if dec.in == nil { 46 if err := dec.p.finalize(); err != nil { 47 return err 48 } 49 return io.EOF 50 } 51 52 n, err := dec.in.Read(dec.buffer0) 53 dec.buffer = dec.buffer0[:n] 54 if n == 0 && err != nil { 55 return err 56 } 57 } 58 59 n, reported, err = dec.p.feedUntil(dec.buffer) 60 if err != nil { 61 return err 62 } 63 64 dec.buffer = dec.buffer[n:] 65 if reported { 66 return nil 67 } 68 } 69 70 return nil 71 }