-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparser.go
62 lines (48 loc) · 1.21 KB
/
parser.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
60
61
62
package repository
import (
"bytes"
"fmt"
"strings"
)
type OrderedDict struct {
keys []string
value map[string]interface{}
}
func NewOrderedMap() *OrderedDict {
return &OrderedDict{
keys: make([]string, 0),
value: make(map[string]interface{}),
}
}
func (om *OrderedDict) Add(key string, value interface{}) {
om.keys = append(om.keys, key)
om.value[key] = value
}
func KvlmParse(raw []byte, start int, dct *OrderedDict) (*OrderedDict, int) {
if dct == nil {
dct = NewOrderedMap()
}
spxIdx := bytes.IndexByte(raw[start:], ' ')
nwlIdx := bytes.IndexByte(raw[start:], '\n')
if spxIdx < 0 || nwlIdx < spxIdx {
return kvlmParseMessage(raw, start, dct)
}
key := string(raw[start : start+spxIdx])
end := kvlmFindValueEnd(raw, start+spxIdx)
value := string(raw[start+spxIdx+1 : end])
value = strings.Replace(value, "\n ", "\n", 1)
dct.Add(key, value)
return KvlmParse(raw, end+1, dct)
}
func kvlmFindValueEnd(raw []byte, start int) int {
for i := start; i < len(raw)-1; i++ {
if raw[i] == '\n' && raw[i+1] != ' ' {
return i
}
}
return len(raw)
}
func kvlmParseMessage(raw []byte, start int, od *OrderedDict) (*OrderedDict, int) {
od.Add("", string(raw[start+1:]))
return od, len(raw)
}