github.com/urso/go-structform@v0.0.2/cborl/decode.go (about) 1 package cborl 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 return io.EOF 47 } 48 49 n, err := dec.in.Read(dec.buffer0) 50 dec.buffer = dec.buffer0[:n] 51 if err != nil { 52 return err 53 } 54 } 55 56 n, reported, err = dec.p.feedUntil(dec.buffer) 57 if err != nil { 58 return err 59 } 60 61 dec.buffer = dec.buffer[n:] 62 if reported { 63 return nil 64 } 65 } 66 67 return nil 68 }