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 }