-
Notifications
You must be signed in to change notification settings - Fork 5
/
parse.go
103 lines (80 loc) · 1.31 KB
/
parse.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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package hashuri
import (
"strings"
)
// hashuri.Parse parses value into a hashuri.Type structure.
func Parse(dest *Type, value string) error {
if nil == dest {
return errNilDestination
}
s := value
{
const prefix string = "hash:"
if len(s) < len(prefix) {
return errNotHashURI
}
if !strings.HasPrefix(s, prefix) {
return errNotHashURI
}
s = s[len(prefix):]
}
{
const prefix string = "//"
if !strings.HasPrefix(s, prefix) {
return errNotHashURI
}
s = s[len(prefix):]
}
{
index := strings.IndexRune(s, '/')
if 0 > index {
return errNotHashURI
}
dest.Algorithm = s[:index]
dest.Hash = ""
dest.RawQuery = ""
dest.Fragment = ""
s = s[1+index:]
}
{
var index int = -1
if 0 > index {
index = strings.IndexRune(s, '?')
}
if 0 > index {
index = strings.IndexRune(s, '#')
}
switch {
case 0 > index:
dest.Hash = s
return nil
default:
dest.Hash = s[:index]
}
s = s[index:]
}
{
s0 := s[0]
if '?' != s0 {
goto skipRawQuery
}
index := strings.IndexRune(s, '#')
switch {
case 0 > index:
dest.RawQuery = s[1:]
return nil
default:
dest.RawQuery = s[1:index]
}
s = s[index:]
}
skipRawQuery:
{
s0 := s[0]
if '#' != s0 {
return errInternalError
}
dest.Fragment = s[1:]
}
return nil
}