Left: | ||
Right: |
OLD | NEW |
---|---|
1 // Copyright 2013 Canonical Ltd. | 1 // Copyright 2013 Canonical Ltd. |
2 // Licensed under the AGPLv3, see LICENCE file for details. | 2 // Licensed under the AGPLv3, see LICENCE file for details. |
3 | 3 |
4 package names | 4 package names |
5 | 5 |
6 import ( | 6 import ( |
7 "fmt" | 7 "fmt" |
8 "strings" | 8 "strings" |
9 ) | 9 ) |
10 | 10 |
11 const ( | 11 const ( |
12 UnitTagKind = "unit" | 12 UnitTagKind = "unit" |
13 MachineTagKind = "machine" | 13 MachineTagKind = "machine" |
14 ServiceTagKind = "service" | 14 ServiceTagKind = "service" |
15 EnvironTagKind = "environment" | 15 EnvironTagKind = "environment" |
16 UserTagKind = "user" | 16 UserTagKind = "user" |
17 ) | 17 ) |
18 | 18 |
19 var validKinds = map[string]bool{ | 19 var validKinds = map[string]bool{ |
20 UnitTagKind: true, | 20 UnitTagKind: true, |
21 MachineTagKind: true, | 21 MachineTagKind: true, |
22 ServiceTagKind: true, | 22 ServiceTagKind: true, |
23 EnvironTagKind: true, | 23 EnvironTagKind: true, |
24 UserTagKind: true, | 24 UserTagKind: true, |
25 } | 25 } |
26 | 26 |
27 var fromTagName = map[string]func(string) string{ | |
28 UnitTagKind: unitFromTagName, | |
dimitern
2013/08/06 09:35:40
unitFromTag and machineFromTag please. There's no
rog
2013/08/06 09:50:08
a tag has two parts - these functions operate on t
dimitern
2013/08/06 10:00:28
fromTagSuffix, as agreed.
rog
2013/08/06 10:04:20
Done (slightly differently)
| |
29 MachineTagKind: machineFromTagName, | |
30 } | |
31 | |
32 var verifyId = map[string]func(string) bool{ | |
33 UnitTagKind: IsUnit, | |
34 MachineTagKind: IsMachine, | |
35 ServiceTagKind: IsService, | |
36 UserTagKind: IsUser, | |
37 EnvironTagKind: IsEnvironment, | |
38 } | |
39 | |
27 // TagKind returns one of the *TagKind constants for the given tag, or | 40 // TagKind returns one of the *TagKind constants for the given tag, or |
28 // an error if none matches. | 41 // an error if none matches. |
29 func TagKind(tag string) (string, error) { | 42 func TagKind(tag string) (string, error) { |
30 i := strings.Index(tag, "-") | 43 i := strings.Index(tag, "-") |
31 if i <= 0 || !validKinds[tag[:i]] { | 44 if i <= 0 || !validKinds[tag[:i]] { |
32 return "", fmt.Errorf("%q is not a valid tag", tag) | 45 return "", fmt.Errorf("%q is not a valid tag", tag) |
33 } | 46 } |
34 return tag[:i], nil | 47 return tag[:i], nil |
35 } | 48 } |
36 | 49 |
37 func splitTag(tag string) (kind, rest string, err error) { | 50 func splitTag(tag string) (kind, rest string, err error) { |
38 kind, err = TagKind(tag) | 51 kind, err = TagKind(tag) |
39 if err != nil { | 52 if err != nil { |
40 return "", "", err | 53 return "", "", err |
41 } | 54 } |
42 return kind, tag[len(kind)+1:], nil | 55 return kind, tag[len(kind)+1:], nil |
43 } | 56 } |
44 | 57 |
45 func makeTag(kind, rest string) string { | 58 func makeTag(kind, rest string) string { |
46 return kind + "-" + rest | 59 return kind + "-" + rest |
47 } | 60 } |
61 | |
62 // ParseTag parses a tag into its kind and identifier | |
63 // components. It returns an error if the tag is malformed, | |
64 // or if expectKind is not empty and the kind is | |
65 // not as expected. | |
66 func ParseTag(tag, expectKind string) (kind, id string, err error) { | |
67 kind, id, err = splitTag(tag) | |
68 if err != nil { | |
69 if expectKind != "" { | |
70 return "", "", fmt.Errorf("%q is not a valid %s tag", ta g, expectKind) | |
71 } | |
72 return "", "", fmt.Errorf("%q is not a valid tag", tag) | |
73 } | |
74 if expectKind != "" && kind != expectKind { | |
75 return "", "", fmt.Errorf("%q is not a valid %s tag", tag, expec tKind) | |
76 } | |
77 if fromTag := fromTagName[kind]; fromTag != nil { | |
dimitern
2013/08/06 09:35:40
if fromTagFunc := fromTag[kind]; fromTagFunc != ni
| |
78 id = fromTag(id) | |
79 } | |
80 if verify := verifyId[kind]; verify != nil && !verify(id) { | |
81 return "", "", fmt.Errorf("%q is not a valid %s tag", tag, kind) | |
82 } | |
83 return kind, id, nil | |
84 } | |
OLD | NEW |