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)
|
nn, err := encoder.Write(value)
|
||||||
n += nn; if err != nil { return n, err }
|
n += nn; if err != nil { return n, err }
|
||||||
|
return n, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// aggregates
|
// aggregates
|
||||||
@ -184,7 +185,7 @@ func TagAny(value any) (Tag, error) {
|
|||||||
// aggregates
|
// aggregates
|
||||||
reflectType := reflect.TypeOf(value)
|
reflectType := reflect.TypeOf(value)
|
||||||
switch reflectType.Kind() {
|
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.Array: return OTA.WithCN(reflectType.Len()), nil
|
||||||
case reflect.Map:
|
case reflect.Map:
|
||||||
if reflectType.Key() == reflect.TypeOf(uint16(0)) {
|
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)
|
reflectType := reflect.TypeOf(value)
|
||||||
oneTag, err := TagAny(reflect.Zero(reflectType.Elem()).Interface())
|
oneTag, err := TagAny(reflect.Zero(reflectType.Elem()).Interface())
|
||||||
if err != nil { return n, err }
|
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()
|
item := reflectValue.Index(index).Interface()
|
||||||
itemTag, err := TagAny(item)
|
itemTag, err := TagAny(item)
|
||||||
if err != nil { return n, err }
|
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 }
|
if oneTag.Is(SBA) { oneTag += 1 << 5 }
|
||||||
nn, err = encoder.WriteUint8(uint8(oneTag))
|
nn, err = encoder.WriteUint8(uint8(oneTag))
|
||||||
n += nn; if err != nil { return n, err }
|
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()
|
item := reflectValue.Index(index).Interface()
|
||||||
nn, err = EncodeAny(encoder, item, oneTag)
|
nn, err = EncodeAny(encoder, item, oneTag)
|
||||||
n += nn; if err != nil { return n, err }
|
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)
|
nn, err = encoder.WriteUint16(key)
|
||||||
n += nn; if err != nil { return n, err }
|
n += nn; if err != nil { return n, err }
|
||||||
itemTag, err := TagAny(value)
|
itemTag, err := TagAny(value)
|
||||||
n += nn; if err != nil { return n, err }
|
if err != nil { return n, err }
|
||||||
nn, err = encoder.WriteUint8(uint8(itemTag))
|
nn, err = encoder.WriteUint8(uint8(itemTag))
|
||||||
n += nn; if err != nil { return n, err }
|
n += nn; if err != nil { return n, err }
|
||||||
nn, err = EncodeAny(encoder, value, itemTag)
|
nn, err = EncodeAny(encoder, value, itemTag)
|
||||||
|
Loading…
Reference in New Issue
Block a user