More verbose error on missing field

pull/6/head
Clayton Coleman 2014-07-30 19:41:54 -04:00
parent 76e2cd70f7
commit 7ce23e43e7
2 changed files with 32 additions and 3 deletions

View File

@ -141,11 +141,11 @@ func (c *Converter) convert(sv, dv reflect.Value) error {
case reflect.Struct:
for i := 0; i < dt.NumField(); i++ {
f := dv.Type().Field(i)
df := dv.FieldByName(f.Name)
sf := sv.FieldByName(f.Name)
if !df.IsValid() || !sf.IsValid() {
return fmt.Errorf("%v not present in source and dest.", f.Name)
if !sf.IsValid() {
return fmt.Errorf("%v not present in source %v for dest %v", f.Name, sv.Type(), dv.Type())
}
df := dv.Field(i)
if err := c.convert(sf, df); err != nil {
return err
}

View File

@ -79,3 +79,32 @@ func TestConverter(t *testing.T) {
t.Errorf("unexpected non-error")
}
}
func anonymousEmptyTypeNamedA() interface{} {
type A struct{}
return &A{}
}
func TestCopyConvertor(t *testing.T) {
type A struct {
Bar string
}
type B struct {
Bar string
}
c := NewConverter()
err := c.Convert(anonymousEmptyTypeNamedA(), &A{})
if err == nil {
t.Errorf("unexpected non-error")
}
err = c.Convert(&A{}, anonymousEmptyTypeNamedA())
if err != nil {
t.Fatalf("unexpected error %v", err)
}
err = c.Convert(&B{}, &A{})
if err == nil {
t.Errorf("unexpected non-error")
}
}