-
Notifications
You must be signed in to change notification settings - Fork 0
/
name-hieararchy.go
63 lines (54 loc) · 1.22 KB
/
name-hieararchy.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
package commonlog
//
// NameHierarchy
//
// Convenience type for implementing maximum level per name in backends.
// Supports level inheritance.
type NameHierarchy struct {
root *nameHierarchyNode
}
func NewNameHierarchy() *NameHierarchy {
return &NameHierarchy{
root: newMaxLevelHierarchyNode(),
}
}
func (self *NameHierarchy) AllowLevel(level Level, name ...string) bool {
return level <= self.GetMaxLevel(name...)
}
func (self *NameHierarchy) GetMaxLevel(name ...string) Level {
node := self.root
for _, segment := range name {
if child, ok := node.children[segment]; ok {
node = child
} else {
break
}
}
return node.maxLevel
}
func (self *NameHierarchy) SetMaxLevel(level Level, name ...string) {
node := self.root
for _, segment := range name {
if child, ok := node.children[segment]; ok {
node = child
} else {
child = newMaxLevelHierarchyNode()
node.children[segment] = child
node = child
}
}
node.maxLevel = level
}
//
// nameHierarchyNode
//
type nameHierarchyNode struct {
maxLevel Level
children map[string]*nameHierarchyNode
}
func newMaxLevelHierarchyNode() *nameHierarchyNode {
return &nameHierarchyNode{
maxLevel: None,
children: make(map[string]*nameHierarchyNode),
}
}