github.com/batchcorp/thrift-iterator@v0.0.0-20220918180557-4c4a158fc6e9/raw/decode_map.go (about) 1 package raw 2 3 import ( 4 "github.com/batchcorp/thrift-iterator/spi" 5 "github.com/batchcorp/thrift-iterator/protocol" 6 ) 7 8 type rawMapDecoder struct { 9 } 10 11 func (decoder *rawMapDecoder) Decode(val interface{}, iter spi.Iterator) { 12 keyType, elemType, length := iter.ReadMapHeader() 13 entries := make(map[interface{}]MapEntry, length) 14 generalKeyReader := readerOf(keyType) 15 keyIter := iter.Spawn() 16 for i := 0; i < length; i++ { 17 keyBuf := iter.Skip(keyType, nil) 18 key := generalKeyReader(keyBuf, keyIter) 19 elemBuf := iter.Skip(elemType, nil) 20 entries[key] = MapEntry{ 21 Key: keyBuf, 22 Element: elemBuf, 23 } 24 } 25 obj := val.(*Map) 26 obj.KeyType = keyType 27 obj.ElementType = elemType 28 obj.Entries = entries 29 } 30 31 func readerOf(valType protocol.TType) func([]byte, spi.Iterator) interface{} { 32 switch valType { 33 case protocol.TypeBool: 34 return readBool 35 case protocol.TypeI08: 36 return readInt8 37 case protocol.TypeI16: 38 return readInt16 39 case protocol.TypeI32: 40 return readInt32 41 case protocol.TypeI64: 42 return readInt64 43 case protocol.TypeDouble: 44 return readFloat64 45 case protocol.TypeString: 46 return readString 47 default: 48 panic("unsupported type") 49 } 50 } 51 52 func readBool(buf []byte, iter spi.Iterator) interface{} { 53 iter.Reset(nil, buf) 54 return iter.ReadBool() 55 } 56 57 func readInt8(buf []byte, iter spi.Iterator) interface{} { 58 iter.Reset(nil, buf) 59 return iter.ReadInt8() 60 } 61 62 func readInt16(buf []byte, iter spi.Iterator) interface{} { 63 iter.Reset(nil, buf) 64 return iter.ReadInt16() 65 } 66 67 func readInt32(buf []byte, iter spi.Iterator) interface{} { 68 iter.Reset(nil, buf) 69 return iter.ReadInt32() 70 } 71 72 func readInt64(buf []byte, iter spi.Iterator) interface{} { 73 iter.Reset(nil, buf) 74 return iter.ReadInt64() 75 } 76 77 func readFloat64(buf []byte, iter spi.Iterator) interface{} { 78 iter.Reset(nil, buf) 79 return iter.ReadFloat64() 80 } 81 82 func readString(buf []byte, iter spi.Iterator) interface{} { 83 iter.Reset(nil, buf) 84 return iter.ReadString() 85 }