func()

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
}