diff --git a/unmarshal.go b/unmarshal.go index 63b4b1d..ffcc611 100644 --- a/unmarshal.go +++ b/unmarshal.go @@ -110,6 +110,11 @@ func (p *Decoder) unmarshal(pval cfValue, val reflect.Value) { incompatibleTypeError := &incompatibleDecodeTypeError{val.Type(), pval.typeName()} + if receiver, can := implementsInterface(val, plistUnmarshalerType); can { + p.unmarshalPlistInterface(pval, receiver.(Unmarshaler)) + return + } + // time.Time implements TextMarshaler, but we need to parse it as RFC3339 if date, ok := pval.(cfDate); ok { if val.Type() == timeType { @@ -119,11 +124,6 @@ func (p *Decoder) unmarshal(pval cfValue, val reflect.Value) { panic(incompatibleTypeError) } - if receiver, can := implementsInterface(val, plistUnmarshalerType); can { - p.unmarshalPlistInterface(pval, receiver.(Unmarshaler)) - return - } - if val.Type() != timeType { if receiver, can := implementsInterface(val, textUnmarshalerType); can { if str, ok := pval.(cfString); ok { diff --git a/unmarshal_test.go b/unmarshal_test.go index c673793..0535232 100644 --- a/unmarshal_test.go +++ b/unmarshal_test.go @@ -40,3 +40,20 @@ func BenchmarkLargeArrayUnmarshal(b *testing.B) { d.unmarshal(pval, reflect.ValueOf(&xval)) } } + +type CustomDate struct{} + +func (cd *CustomDate) UnmarshalPlist(unmarshal func(interface{}) error) error { return nil } + +func TestCustomDateUnmarshal(t *testing.T) { + input := ` + + + 2003-02-03T09:00:00.00Z +` + + var custom CustomDate + if _, err := Unmarshal([]byte(input), &custom); err != nil { + t.Error(err) + } +}