Merge pull request #711 from smarterclayton/more_info_about_format_conversion_error

More verbose error on missing field
This commit is contained in:
Daniel Smith 2014-07-31 14:34:09 -07:00
commit aa454fea93
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: case reflect.Struct:
for i := 0; i < dt.NumField(); i++ { for i := 0; i < dt.NumField(); i++ {
f := dv.Type().Field(i) f := dv.Type().Field(i)
df := dv.FieldByName(f.Name)
sf := sv.FieldByName(f.Name) sf := sv.FieldByName(f.Name)
if !df.IsValid() || !sf.IsValid() { if !sf.IsValid() {
return fmt.Errorf("%v not present in source and dest.", f.Name) 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 { if err := c.convert(sf, df); err != nil {
return err return err
} }

View File

@ -79,3 +79,32 @@ func TestConverter(t *testing.T) {
t.Errorf("unexpected non-error") 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")
}
}