decode.Unmarshal   A
last analyzed

Complexity

Conditions 3

Size

Total Lines 15
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 3.0175

Importance

Changes 0
Metric Value
cc 3
eloc 9
dl 0
loc 15
ccs 7
cts 8
cp 0.875
crap 3.0175
rs 9.95
c 0
b 0
f 0
nop 2
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