/
resource.go
114 lines (97 loc) · 2.57 KB
/
resource.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
104
105
106
107
108
109
110
111
112
113
114
package khulnasoft
import "fmt"
// RouteLevel holds the "level" where the resource resides. Commonly used in
// routing configurations or builders.
type RouteLevel string
// ResourceType holds the type of the resource. This is similar to `RouteLevel`
// however this is the singular version of `RouteLevel` and isn't suitable for
// use in routing.
type ResourceType string
const (
user = "user"
zone = "zone"
account = "account"
zones = zone + "s"
accounts = account + "s"
AccountRouteLevel RouteLevel = accounts
ZoneRouteLevel RouteLevel = zones
UserRouteLevel RouteLevel = user
AccountType ResourceType = account
ZoneType ResourceType = zone
UserType ResourceType = user
)
// ResourceContainer defines an API resource you wish to target. Should not be
// used directly, use `UserIdentifier`, `ZoneIdentifier` and `AccountIdentifier`
// instead.
type ResourceContainer struct {
Level RouteLevel
Identifier string
Type ResourceType
}
func (r RouteLevel) String() string {
switch r {
case AccountRouteLevel:
return accounts
case ZoneRouteLevel:
return zones
case UserRouteLevel:
return user
default:
return "unknown"
}
}
func (r ResourceType) String() string {
switch r {
case AccountType:
return account
case ZoneType:
return zone
case UserType:
return user
default:
return "unknown"
}
}
// Returns a URL fragment of the endpoint scoped by the container.
//
// For example, a zone identifier would have a fragment like "zones/foobar" while
// an account identifier would generate "accounts/foobar".
func (rc *ResourceContainer) URLFragment() string {
if rc.Level == "" {
return rc.Identifier
}
if rc.Level == UserRouteLevel {
return user
}
return fmt.Sprintf("%s/%s", rc.Level, rc.Identifier)
}
// ResourceIdentifier returns a generic *ResourceContainer.
func ResourceIdentifier(id string) *ResourceContainer {
return &ResourceContainer{
Identifier: id,
}
}
// UserIdentifier returns a user level *ResourceContainer.
func UserIdentifier(id string) *ResourceContainer {
return &ResourceContainer{
Level: UserRouteLevel,
Identifier: id,
Type: UserType,
}
}
// ZoneIdentifier returns a zone level *ResourceContainer.
func ZoneIdentifier(id string) *ResourceContainer {
return &ResourceContainer{
Level: ZoneRouteLevel,
Identifier: id,
Type: ZoneType,
}
}
// AccountIdentifier returns an account level *ResourceContainer.
func AccountIdentifier(id string) *ResourceContainer {
return &ResourceContainer{
Level: AccountRouteLevel,
Identifier: id,
Type: AccountType,
}
}