forked from sensu/sensu-go
/
path.go
56 lines (46 loc) · 1.69 KB
/
path.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
package client
import (
"net/url"
"path"
)
const coreAPIGroup = "core"
const coreAPIVersion = "v2"
// CreateBasePath ...
func CreateBasePath(group, version string, resType ...string) func(...string) string {
fn := createNSBasePath(group, version, resType...)
return func(components ...string) string {
// first arg "" represents that no namespace has been specified
return fn("", components...)
}
}
// Returns an anonymous function that when given a namespace and additional path
// components returns a full path to a endpoint. If namespace is an empty string
// namespaces prefix is omitted from the resulting path.
//
// pathFn := createNSBasePath("core", "v1", "users")
// pathFn("sensu") // /api/core/v1/namespaces/sensu/users
// pathFn("sensu", "frank-west") // /api/core/v1/namespaces/sensu/users/frank-west
// pathFn("") // /api/core/v1/users
//
// pathFn = createNSBasePath("core", "v1", "rbac", "rules")
// pathFn("sensu", "admin") // /api/core/v1/namespaces/sensu/rbac/rules/admin
// pathFn("") // /api/core/v1/namespaces/sensu/rbac/rules
//
func createNSBasePath(group, version string, resType ...string) func(string, ...string) string {
baseComponents := []string{"/api", group, version}
return func(namespace string, pathComponents ...string) string {
components := []string{}
components = append(components, baseComponents...)
// namespace
if namespace != "" {
components = append(components, "namespaces", namespace)
}
// resource type
components = append(components, resType...)
// append given path components
for _, path := range pathComponents {
components = append(components, url.PathEscape(path))
}
return path.Join(components...)
}
}