func HandlePrimitiveEncoding()

in cassandra-bigtable-migration-tools/cassandra-bigtable-proxy/responsehandler/responsehandler_utils.go [324:368]


func HandlePrimitiveEncoding(dt datatype.DataType, value interface{}, protocalVersion primitive.ProtocolVersion, encode bool) (interface{}, error) {
	val := reflect.ValueOf(value)
	if !val.IsValid() {
		return value, nil
	}
	if val.Kind() == reflect.Slice {
		if val.Len() == 0 {
			return value, nil
		}
	}
	var decodedValue interface{}
	var err error
	if dt == datatype.Boolean {
		decodedValue, err = decodeAndReturnBool(value, protocalVersion)
	} else if dt == datatype.Int {
		decodedValue, err = decodeAndReturnInt(value, protocalVersion)
	} else if dt == datatype.Bigint || dt == datatype.Timestamp {
		decodedValue, err = decodeAndReturnBigInt(value, protocalVersion)
	} else if dt == datatype.Float {
		decodedValue, err = decodeAndReturnFloat(value, protocalVersion)
	} else if dt == datatype.Double {
		decodedValue, err = decodeAndReturnDouble(value, protocalVersion)
	} else if dt == datatype.Varchar {
		byteArray, okByte := value.([]byte)
		stringValue, okString := value.(string)
		if !okByte && !okString {
			return nil, fmt.Errorf("value is not a byte array or string")
		}
		if okByte {
			decodedValue = string(byteArray)
		} else {
			decodedValue = stringValue
		}
	} else {
		return nil, fmt.Errorf("unsupported primitive type: %s", dt.String())
	}
	if err != nil {
		return nil, err
	}
	if encode {
		encoded, _ := proxycore.EncodeType(dt, protocalVersion, decodedValue)
		return encoded, nil
	}
	return decodedValue, nil
}