github.com/batchcorp/thrift-iterator@v0.0.0-20220918180557-4c4a158fc6e9/decoder.go (about)

     1  package thrifter
     2  
     3  import (
     4  	"github.com/batchcorp/thrift-iterator/general"
     5  	"github.com/batchcorp/thrift-iterator/protocol"
     6  	"github.com/batchcorp/thrift-iterator/spi"
     7  	"io"
     8  	"reflect"
     9  )
    10  
    11  type Decoder struct {
    12  	cfg  *frozenConfig
    13  	iter spi.Iterator
    14  }
    15  
    16  func (decoder *Decoder) Decode(val interface{}) error {
    17  	cfg := decoder.cfg
    18  	valType := reflect.TypeOf(val)
    19  	valDecoder := cfg.getGenDecoder(valType)
    20  	if valDecoder == nil {
    21  		valDecoder = cfg.decoderOf(valType)
    22  		cfg.addGenDecoder(valType, valDecoder)
    23  	}
    24  	valDecoder.Decode(val, decoder.iter)
    25  	if decoder.iter.Error() != nil {
    26  		return decoder.iter.Error()
    27  	}
    28  	return nil
    29  }
    30  
    31  func (decoder *Decoder) DecodeMessage() (general.Message, error) {
    32  	var msg general.Message
    33  	err := decoder.Decode(&msg)
    34  	return msg, err
    35  }
    36  
    37  func (decoder *Decoder) DecodeMessageHeader() (protocol.MessageHeader, error) {
    38  	var msgHeader protocol.MessageHeader
    39  	err := decoder.Decode(&msgHeader)
    40  	return msgHeader, err
    41  }
    42  
    43  func (decoder *Decoder) DecodeMessageArguments() (general.Struct, error) {
    44  	var msgArgs general.Struct
    45  	err := decoder.Decode(&msgArgs)
    46  	return msgArgs, err
    47  }
    48  
    49  func (decoder *Decoder) Reset(reader io.Reader, buf []byte) {
    50  	decoder.iter.Reset(reader, buf)
    51  }