-
-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathnode.go
More file actions
119 lines (97 loc) · 2.64 KB
/
Copy pathnode.go
File metadata and controls
119 lines (97 loc) · 2.64 KB
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
115
116
117
118
119
package golax
import "strings"
// Node represents a path part of an URL
type Node struct {
Interceptors []*Interceptor
InterceptorsDeep []*Interceptor
Methods map[string]Handler
Children []*Node
Documentation Doc
DocumentationMethods map[string]Doc
Operations map[string]*Operation
_path string
_hasOperations bool
_isParameter bool
_isRegex bool
_isFullPath bool
_parameterKey string
}
// NewNode instances and initializes a new node
func NewNode() *Node {
return &Node{
_path: "",
Interceptors: []*Interceptor{},
InterceptorsDeep: []*Interceptor{},
Methods: map[string]Handler{},
Children: []*Node{},
DocumentationMethods: map[string]Doc{},
Operations: map[string]*Operation{},
}
}
// Method implements an HTTP method for a handler and optionally allows
// a third documentation parameter
func (n *Node) Method(m string, h Handler, d ...Doc) *Node {
M := strings.ToUpper(m)
n.Methods[M] = h
if len(d) > 0 {
n.DocumentationMethods[M] = d[0]
}
return n
}
// Interceptor attaches an *Interceptor to a *Node
func (n *Node) Interceptor(m *Interceptor) *Node {
n.Interceptors = append(n.Interceptors, m)
return n
}
// InterceptorDeep attaches an *Interceptor to a *Node but will be executed
// after all regular interceptors.
func (n *Node) InterceptorDeep(m *Interceptor) *Node {
n.InterceptorsDeep = append(n.InterceptorsDeep, m)
return n
}
// Doc attaches documentation to a *Node
func (n *Node) Doc(d Doc) *Node {
n.Documentation = d
return n
}
// Node appends a child node
func (n *Node) Node(p string) *Node {
newNode := NewNode()
newNode.SetPath(p)
n.Children = append(n.Children, newNode)
return newNode
}
// Operation appends an operation to a *Node
func (n *Node) Operation(p string) *Operation {
n._hasOperations = true
newOperation := NewOperation()
newOperation.Path = p
n.Operations[p] = newOperation
return newOperation
}
// SetPath modifies a node path
func (n *Node) SetPath(p string) {
n._path = p
if "{{*}}" == p {
n._isFullPath = true
} else if isParameter(p) {
n._isParameter = true
n._parameterKey = biTrim("{", p, "}")
} else if isRegex(p) {
n._isRegex = true
n._parameterKey = biTrim("(", p, ")")
}
}
// GetPath retrieves a node path
func (n *Node) GetPath() string {
return n._path
}
func isParameter(path string) bool {
return '{' == path[0] && '}' == path[len(path)-1]
}
func isRegex(path string) bool {
return '(' == path[0] && ')' == path[len(path)-1]
}
func biTrim(l, s, r string) string {
return strings.TrimLeft(strings.TrimRight(s, r), l)
}