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

     1  package spi
     2  
     3  import (
     4  	"io"
     5  	"github.com/batchcorp/thrift-iterator/protocol"
     6  	"reflect"
     7  )
     8  
     9  type Iterator interface {
    10  	ValDecoderProvider
    11  	Spawn() Iterator
    12  	Error() error
    13  	Reset(reader io.Reader, buf []byte)
    14  	ReportError(operation string, err string)
    15  	ReadMessageHeader() protocol.MessageHeader
    16  	SkipMessageHeader(space []byte) []byte
    17  	ReadStructHeader()
    18  	ReadStructField() (fieldType protocol.TType, fieldId protocol.FieldId)
    19  	SkipStruct(space []byte) []byte
    20  	ReadListHeader() (elemType protocol.TType, size int)
    21  	SkipList(space []byte) []byte
    22  	ReadMapHeader() (keyType protocol.TType, elemType protocol.TType, size int)
    23  	SkipMap(space []byte) []byte
    24  	ReadBool() bool
    25  	ReadInt() int
    26  	ReadUint() uint
    27  	ReadInt8() int8
    28  	ReadUint8() uint8
    29  	ReadInt16() int16
    30  	ReadUint16() uint16
    31  	ReadInt32() int32
    32  	ReadUint32() uint32
    33  	ReadInt64() int64
    34  	ReadUint64() uint64
    35  	ReadFloat64() float64
    36  	ReadString() string
    37  	ReadBinary() []byte
    38  	SkipBinary(space []byte) []byte
    39  	Skip(ttype protocol.TType, space []byte) []byte
    40  	Discard(ttype protocol.TType)
    41  }
    42  
    43  type Stream interface {
    44  	ValEncoderProvider
    45  	Spawn() Stream
    46  	Error() error
    47  	ReportError(operation string, err string)
    48  	Reset(writer io.Writer)
    49  	Flush()
    50  	Buffer() []byte
    51  	Write(buf []byte) error
    52  	WriteMessageHeader(header protocol.MessageHeader)
    53  	WriteListHeader(elemType protocol.TType, length int)
    54  	WriteStructHeader()
    55  	WriteStructField(fieldType protocol.TType, fieldId protocol.FieldId)
    56  	WriteStructFieldStop()
    57  	WriteMapHeader(keyType protocol.TType, elemType protocol.TType, length int)
    58  	WriteBool(val bool)
    59  	WriteInt(val int)
    60  	WriteUint(val uint)
    61  	WriteInt8(val int8)
    62  	WriteUint8(val uint8)
    63  	WriteInt16(val int16)
    64  	WriteUint16(val uint16)
    65  	WriteInt32(val int32)
    66  	WriteUint32(val uint32)
    67  	WriteInt64(val int64)
    68  	WriteUint64(val uint64)
    69  	WriteFloat64(val float64)
    70  	WriteBinary(val []byte)
    71  	WriteString(val string)
    72  }
    73  
    74  type ValEncoder interface {
    75  	Encode(val interface{}, stream Stream)
    76  	ThriftType() protocol.TType
    77  }
    78  
    79  type ValDecoder interface {
    80  	Decode(val interface{}, iter Iterator)
    81  }
    82  
    83  type ValDecoderProvider interface {
    84  	PrepareDecoder(valType reflect.Type)
    85  	GetDecoder(decoderName string) ValDecoder
    86  }
    87  
    88  type ValEncoderProvider interface {
    89  	PrepareEncoder(valType reflect.Type)
    90  	GetEncoder(encoderName string) ValEncoder
    91  }
    92  
    93  type Extension interface {
    94  	DecoderOf(valType reflect.Type) ValDecoder
    95  	EncoderOf(valType reflect.Type) ValEncoder
    96  }
    97  
    98  type DummyExtension struct {
    99  }
   100  
   101  func (extension *DummyExtension) DecoderOf(valType reflect.Type) ValDecoder {
   102  	return nil
   103  }
   104  
   105  func (extension *DummyExtension) EncoderOf(valType reflect.Type) ValEncoder {
   106  	return nil
   107  }
   108  
   109  type Extensions []Extension
   110  
   111  func (extensions Extensions) DecoderOf(valType reflect.Type) ValDecoder {
   112  	for _, extension := range extensions {
   113  		decoder := extension.DecoderOf(valType)
   114  		if decoder != nil {
   115  			return decoder
   116  		}
   117  	}
   118  	return nil
   119  }
   120  
   121  func (extensions Extensions) EncoderOf(valType reflect.Type) ValEncoder {
   122  	for _, extension := range extensions {
   123  		encoder := extension.EncoderOf(valType)
   124  		if encoder != nil {
   125  			return encoder
   126  		}
   127  	}
   128  	return nil
   129  }