You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

39 lines
825 B
Go

package moon
import (
"fmt"
"reflect"
)
type List []interface{}
func (l List) fillValue(v reflect.Value) error {
if v.Kind() != reflect.Slice {
return fmt.Errorf("moon List can only fillValue to a slice, saw %v (%v)", v.Type(), v.Kind())
}
if v.IsNil() {
v.Set(reflect.MakeSlice(v.Type(), len(l), cap(l)))
}
for idx, item := range l {
dv := v.Index(idx)
switch t_sv := item.(type) {
case *Object:
if err := t_sv.fillValue(dv); err != nil {
return err
}
case List:
if err := t_sv.fillValue(dv); err != nil {
return err
}
default:
sv := reflect.ValueOf(item)
if !dv.Type().AssignableTo(sv.Type()) {
return fmt.Errorf("unable to assign element %d: source type %v is not assignable to destination type %v", idx, sv.Type(), dv.Type())
}
dv.Set(sv)
}
}
return nil
}