Total Lines | 42 |
Duplicated Lines | 0 % |
Coverage | 80% |
Changes | 0 |
1 | package decode |
||
2 | |||
3 | import ( |
||
4 | "io" |
||
5 | "reflect" |
||
6 | |||
7 | "github.com/et-nik/binngo/binn" |
||
8 | ) |
||
9 | |||
10 | type valueDecoder struct { |
||
11 | binnType binn.Type |
||
12 | } |
||
13 | |||
14 | func newValueDecoder(binnType binn.Type) *valueDecoder { |
||
15 | 1 | return &valueDecoder{binnType} |
|
16 | } |
||
17 | |||
18 | func (vd *valueDecoder) DecodeValue(reader io.Reader, v interface{}) error { |
||
19 | 1 | valuePtr := reflect.ValueOf(v) |
|
20 | 1 | value := valuePtr.Elem() |
|
21 | |||
22 | 1 | if !value.CanSet() { |
|
23 | return ErrCantSetValue |
||
24 | } |
||
25 | |||
26 | 1 | bval, err := readValue(vd.binnType, reader) |
|
27 | 1 | if err != nil { |
|
28 | return err |
||
29 | } |
||
30 | |||
31 | 1 | converted, err := decodeItem(value.Type(), vd.binnType, bval) |
|
32 | 1 | if err != nil { |
|
33 | return err |
||
34 | } |
||
35 | |||
36 | 1 | if value.Kind() != reflect.ValueOf(converted).Kind() && value.Kind() != reflect.Interface { |
|
37 | 1 | return &UnknownValueError{reflect.ValueOf(converted).Kind(), value.Kind()} |
|
38 | } |
||
39 | |||
40 | 1 | value.Set(reflect.ValueOf(converted)) |
|
41 | |||
42 | 1 | return nil |
|
43 | } |
||
44 |