github.com/urso/go-structform@v0.0.2/json/decode.go (about)

     1  package json
     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  }