-
Notifications
You must be signed in to change notification settings - Fork 0
/
map.go
59 lines (50 loc) · 1.25 KB
/
map.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package tlv
import (
"errors"
"fmt"
)
type Map = map[Tag][]byte
type rawMapEncoder[K comparable] struct {
keyEncoder EncoderDecoder[K]
valueEncoder EncoderDecoder[[]byte]
}
func RawMap[K comparable](
keyEncoder EncoderDecoder[K],
valueEncoder EncoderDecoder[[]byte],
) EncoderDecoder[map[K][]byte] {
return rawMapEncoder[K]{
keyEncoder: keyEncoder,
valueEncoder: valueEncoder,
}
}
func (e rawMapEncoder[K]) Decode(state *map[K][]byte, data []byte) (int, error) {
if state == nil || *state == nil {
*state = make(map[K][]byte)
}
nonPointerState := *state
var totalRead int
for len(data) > 0 {
var key K
read, err := e.keyEncoder.Decode(&key, data)
data = data[read:]
totalRead += read
if err != nil {
return totalRead, err
} else if read == 0 {
return totalRead, fmt.Errorf("%d bytes available but the key decoder didn't consume any", len(data))
}
var value []byte
read, err = e.valueEncoder.Decode(&value, data)
data = data[read:]
totalRead += read
if err != nil {
return totalRead, err
}
nonPointerState[key] = value
}
*state = nonPointerState
return totalRead, nil
}
func (e rawMapEncoder[K]) Encode(state map[K][]byte) ([]byte, error) {
return nil, errors.New("TODO: not implemented (simple map)")
}