tape: Fixes to dynamic encoding

This commit is contained in:
Sasha Koshka 2025-06-24 16:08:35 -04:00
parent 712b4f521c
commit e16fec3a81

View File

@ -41,6 +41,7 @@ func EncodeAny(encoder *Encoder, value any, tag Tag) (n int, err error) {
}
nn, err := encoder.Write(value)
n += nn; if err != nil { return n, err }
return n, nil
}
// aggregates
@ -184,7 +185,7 @@ func TagAny(value any) (Tag, error) {
// aggregates
reflectType := reflect.TypeOf(value)
switch reflectType.Kind() {
case reflect.Slice: return OTA.WithCN(reflect.ValueOf(value).Len() - 1), nil
case reflect.Slice: return OTA.WithCN(IntBytes(uint64(reflect.ValueOf(value).Len())) - 1), nil
case reflect.Array: return OTA.WithCN(reflectType.Len()), nil
case reflect.Map:
if reflectType.Key() == reflect.TypeOf(uint16(0)) {
@ -203,7 +204,7 @@ func encodeAnySlice(encoder *Encoder, value any, tag Tag) (n int, err error) {
reflectType := reflect.TypeOf(value)
oneTag, err := TagAny(reflect.Zero(reflectType.Elem()).Interface())
if err != nil { return n, err }
for index := 0; index <= reflectValue.Len(); index += 1 {
for index := 0; index < reflectValue.Len(); index += 1 {
item := reflectValue.Index(index).Interface()
itemTag, err := TagAny(item)
if err != nil { return n, err }
@ -212,7 +213,7 @@ func encodeAnySlice(encoder *Encoder, value any, tag Tag) (n int, err error) {
if oneTag.Is(SBA) { oneTag += 1 << 5 }
nn, err = encoder.WriteUint8(uint8(oneTag))
n += nn; if err != nil { return n, err }
for index := 0; index <= reflectValue.Len(); index += 1 {
for index := 0; index < reflectValue.Len(); index += 1 {
item := reflectValue.Index(index).Interface()
nn, err = EncodeAny(encoder, item, oneTag)
n += nn; if err != nil { return n, err }
@ -232,7 +233,7 @@ func encodeAnyMap(encoder *Encoder, value any, tag Tag) (n int, err error) {
nn, err = encoder.WriteUint16(key)
n += nn; if err != nil { return n, err }
itemTag, err := TagAny(value)
n += nn; if err != nil { return n, err }
if err != nil { return n, err }
nn, err = encoder.WriteUint8(uint8(itemTag))
n += nn; if err != nil { return n, err }
nn, err = EncodeAny(encoder, value, itemTag)