decode/decoder.go   A
last analyzed

Size/Duplication

Total Lines 43
Duplicated Lines 0 %

Test Coverage

Coverage 81.25%

Importance

Changes 0
Metric Value
cc 6
eloc 25
dl 0
loc 43
ccs 13
cts 16
cp 0.8125
crap 6.2373
rs 10
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A decode.decodeUnmarshaler 0 13 3
A decode.Unmarshal 0 15 3
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