...
1 package resourcename
2
3 import "strings"
4
5
6 const RevisionSeparator = '@'
7
8
9
10
11
12
13
14 type Segment string
15
16
17 func (s Segment) IsVariable() bool {
18 return len(s) > 2 && s[0] == '{' && s[len(s)-1] == '}'
19 }
20
21
22
23 func (s Segment) Literal() Literal {
24 switch {
25 case s.IsVariable():
26 return Literal(s[1 : len(s)-1])
27 default:
28 return Literal(s)
29 }
30 }
31
32
33 func (s Segment) IsWildcard() bool {
34 return s == Wildcard
35 }
36
37
38
39
40
41
42
43 type Literal string
44
45
46 func (l Literal) ResourceID() string {
47 if !l.HasRevision() {
48 return string(l)
49 }
50 return string(l[:strings.IndexByte(string(l), RevisionSeparator)])
51 }
52
53
54 func (l Literal) RevisionID() string {
55 if !l.HasRevision() {
56 return ""
57 }
58 return string(l[strings.IndexByte(string(l), RevisionSeparator)+1:])
59 }
60
61
62 func (l Literal) HasRevision() bool {
63 revisionSeparatorIndex := strings.IndexByte(string(l), RevisionSeparator)
64 if revisionSeparatorIndex < 1 || revisionSeparatorIndex >= len(l)-1 {
65 return false
66 }
67 if strings.IndexByte(string(l[revisionSeparatorIndex+1:]), RevisionSeparator) != -1 {
68 return false
69 }
70 return true
71 }
72
View as plain text