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  }