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  }