Total Lines | 43 |
Duplicated Lines | 0 % |
Coverage | 81.25% |
Changes | 0 |
1 | // Package decode implements BINN decoding. |
||
2 | package decode |
||
3 | |||
4 | import ( |
||
5 | "bytes" |
||
6 | "reflect" |
||
7 | ) |
||
8 | |||
9 | type Unmarshaler interface { |
||
10 | UnmarshalBINN([]byte) error |
||
11 | } |
||
12 | |||
13 | var unmarshalerType = reflect.TypeOf((*Unmarshaler)(nil)).Elem() |
||
14 | |||
15 | func Unmarshal(data []byte, v interface{}) error { |
||
16 | 1 | decoder := NewDecoder(bytes.NewReader(data)) |
|
17 | |||
18 | 1 | rt := reflect.TypeOf(v) |
|
19 | |||
20 | 1 | if rt.Implements(unmarshalerType) { |
|
21 | 1 | err := decodeUnmarshaler(data, v) |
|
22 | 1 | if err != nil { |
|
23 | return err |
||
24 | } |
||
25 | |||
26 | 1 | return nil |
|
27 | } |
||
28 | |||
29 | 1 | return decoder.Decode(v) |
|
30 | } |
||
31 | |||
32 | func decodeUnmarshaler(data []byte, v interface{}) error { |
||
33 | 1 | rv := reflect.ValueOf(v) |
|
34 | |||
35 | 1 | unm, ok := rv.Interface().(Unmarshaler) |
|
36 | 1 | if !ok { |
|
37 | return &InvalidUnmarshalError{reflect.TypeOf(v)} |
||
38 | } |
||
39 | 1 | err := unm.UnmarshalBINN(data) |
|
40 | 1 | if err != nil { |
|
41 | return err |
||
42 | } |
||
43 | |||
44 | 1 | return nil |
|
45 | } |
||
46 |