|
|
|
@ -13,8 +13,43 @@ import "reflect"
|
|
|
|
// - string
|
|
|
|
// - string
|
|
|
|
// - []<supported type>
|
|
|
|
// - []<supported type>
|
|
|
|
// - map[uint16]<supported type>
|
|
|
|
// - map[uint16]<supported type>
|
|
|
|
func EncodeAny(encoder *Encoder, value any) (Tag, error) {
|
|
|
|
func EncodeAny(encoder *Encoder, value any, tag Tag) (n int, err error) {
|
|
|
|
// TODO
|
|
|
|
// primitives
|
|
|
|
|
|
|
|
switch value := value.(type) {
|
|
|
|
|
|
|
|
case int: return encoder.WriteInt32(int32(value))
|
|
|
|
|
|
|
|
case uint: return encoder.WriteUint32(uint32(value))
|
|
|
|
|
|
|
|
case int8: return encoder.WriteInt8(value)
|
|
|
|
|
|
|
|
case uint8: return encoder.WriteUint8(value)
|
|
|
|
|
|
|
|
case int16: return encoder.WriteInt16(value)
|
|
|
|
|
|
|
|
case uint16: return encoder.WriteUint16(value)
|
|
|
|
|
|
|
|
case int32: return encoder.WriteInt32(value)
|
|
|
|
|
|
|
|
case uint32: return encoder.WriteUint32(value)
|
|
|
|
|
|
|
|
case int64: return encoder.WriteInt64(value)
|
|
|
|
|
|
|
|
case uint64: return encoder.WriteUint64(value)
|
|
|
|
|
|
|
|
case string: return EncodeAny(encoder, []byte(value), tag)
|
|
|
|
|
|
|
|
case []byte:
|
|
|
|
|
|
|
|
if tag.Is(LBA) {
|
|
|
|
|
|
|
|
nn, err := encoder.WriteUintN(uint64(len(value)), tag.CN() + 1)
|
|
|
|
|
|
|
|
n += nn; if err != nil { return n, err }
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
nn, err := encoder.Write(value)
|
|
|
|
|
|
|
|
n += nn; if err != nil { return n, err }
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// aggregates
|
|
|
|
|
|
|
|
reflectType := reflect.TypeOf(value)
|
|
|
|
|
|
|
|
switch reflectType.Kind() {
|
|
|
|
|
|
|
|
case reflect.Slice:
|
|
|
|
|
|
|
|
return encodeAnySlice(encoder, value, tag)
|
|
|
|
|
|
|
|
case reflect.Array:
|
|
|
|
|
|
|
|
return encodeAnySlice(encoder, reflect.ValueOf(value).Slice(0, reflectType.Len()).Interface(), tag)
|
|
|
|
|
|
|
|
case reflect.Map:
|
|
|
|
|
|
|
|
if reflectType.Key() == reflect.TypeOf(uint16(0)) {
|
|
|
|
|
|
|
|
return encodeAnyMap(encoder, value, tag)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0, fmt.Errorf("cannot encode map key %T, key must be uint16", value)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0, fmt.Errorf("cannot encode type %T", value)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// TagAny returns the correct tag for an "any" value. Returns an error if the
|
|
|
|
// TagAny returns the correct tag for an "any" value. Returns an error if the
|
|
|