tape: Fixes to dynamic encoding
This commit is contained in:
parent
712b4f521c
commit
e16fec3a81
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user