in document/cbor/decode.go [172:208]
func (d *decoder) decodeList(v cbor.List, rv reflect.Value) error {
var isArray bool
switch rv.Kind() {
case reflect.Slice:
// Make room for the slice elements if needed
if rv.IsNil() || rv.Cap() < len(v) {
rv.Set(reflect.MakeSlice(rv.Type(), 0, len(v)))
}
case reflect.Array:
// Limited to capacity of existing array.
isArray = true
case reflect.Interface:
s := make([]interface{}, len(v))
for i, av := range v {
if err := d.decode(av, reflect.ValueOf(&s[i]).Elem(), serde.Tag{}); err != nil {
return err
}
}
rv.Set(reflect.ValueOf(s))
return nil
default:
return &document.UnmarshalTypeError{Value: "list", Type: rv.Type()}
}
// If rv is not a slice, array
for i := 0; i < rv.Cap() && i < len(v); i++ {
if !isArray {
rv.SetLen(i + 1)
}
if err := d.decode(v[i], rv.Index(i), serde.Tag{}); err != nil {
return err
}
}
return nil
}