github.com/batchcorp/thrift-iterator@v0.0.0-20220918180557-4c4a158fc6e9/encoder.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 Encoder struct {
    12  	cfg    *frozenConfig
    13  	stream spi.Stream
    14  }
    15  
    16  func (encoder *Encoder) Encode(val interface{}) error {
    17  	cfg := encoder.cfg
    18  	valType := reflect.TypeOf(val)
    19  	valEncoder := cfg.getGenEncoder(valType)
    20  	if valEncoder == nil {
    21  		valEncoder = cfg.encoderOf(valType)
    22  		cfg.addGenEncoder(valType, valEncoder)
    23  	}
    24  	valEncoder.Encode(val, encoder.stream)
    25  	encoder.stream.Flush()
    26  	if encoder.stream.Error() != nil {
    27  		return encoder.stream.Error()
    28  	}
    29  	return nil
    30  }
    31  
    32  func (encoder *Encoder) EncodeMessage(msg general.Message) error {
    33  	return encoder.Encode(msg)
    34  }
    35  
    36  func (encoder *Encoder) EncodeMessageHeader(msgHeader protocol.MessageHeader) error {
    37  	return encoder.Encode(msgHeader)
    38  }
    39  
    40  func (encoder *Encoder) EncodeMessageArguments(msgArgs general.Struct) error {
    41  	return encoder.Encode(msgArgs)
    42  }
    43  
    44  func (encoder *Encoder) Reset(writer io.Writer) {
    45  	encoder.stream.Reset(writer)
    46  }
    47  
    48  func (encoder *Encoder) Buffer() []byte {
    49  	return encoder.stream.Buffer()
    50  }