| |
| |
| |
|
|
| package context |
|
|
| import "fmt" |
|
|
| type node struct { |
| children []*node |
| value string |
| method []string |
| handle [][]Handler |
| } |
|
|
| func tree() *node { |
| return &node{ |
| children: make([]*node, 0), |
| value: "/", |
| handle: nil, |
| } |
| } |
|
|
| func (n *node) hasMethod(method string) int { |
| for k, m := range n.method { |
| if m == method { |
| return k |
| } |
| } |
| return -1 |
| } |
|
|
| func (n *node) addMethodAndHandler(method string, handler []Handler) { |
| n.method = append(n.method, method) |
| n.handle = append(n.handle, handler) |
| } |
|
|
| func (n *node) addChild(child *node) { |
| n.children = append(n.children, child) |
| } |
|
|
| func (n *node) addContent(value string) *node { |
| var child = n.search(value) |
| if child == nil { |
| child = &node{ |
| children: make([]*node, 0), |
| value: value, |
| } |
| n.addChild(child) |
| } |
| return child |
| } |
|
|
| func (n *node) search(value string) *node { |
| for _, child := range n.children { |
| if child.value == value || child.value == "*" { |
| return child |
| } |
| } |
| return nil |
| } |
|
|
| func (n *node) addPath(paths []string, method string, handler []Handler) { |
| child := n |
| for i := 0; i < len(paths); i++ { |
| child = child.addContent(paths[i]) |
| } |
| child.addMethodAndHandler(method, handler) |
| } |
|
|
| func (n *node) findPath(paths []string, method string) []Handler { |
| child := n |
| for i := 0; i < len(paths); i++ { |
| child = child.search(paths[i]) |
| if child == nil { |
| return nil |
| } |
| } |
|
|
| methodIndex := child.hasMethod(method) |
| if methodIndex == -1 { |
| return nil |
| } |
|
|
| return child.handle[methodIndex] |
| } |
|
|
| func (n *node) print() { |
| fmt.Println(n) |
| } |
|
|
| func (n *node) printChildren() { |
| n.print() |
| for _, child := range n.children { |
| child.printChildren() |
| } |
| } |
|
|
| func stringToArr(path string) []string { |
| var ( |
| paths = make([]string, 0) |
| start = 0 |
| end int |
| isWildcard = false |
| ) |
| for i := 0; i < len(path); i++ { |
| if i == 0 && path[0] == '/' { |
| start = 1 |
| continue |
| } |
| if path[i] == ':' { |
| isWildcard = true |
| } |
| if i == len(path)-1 { |
| end = i + 1 |
| if isWildcard { |
| paths = append(paths, "*") |
| } else { |
| paths = append(paths, path[start:end]) |
| } |
| } |
| if path[i] == '/' { |
| end = i |
| if isWildcard { |
| paths = append(paths, "*") |
| } else { |
| paths = append(paths, path[start:end]) |
| } |
| start = i + 1 |
| isWildcard = false |
| } |
| } |
| return paths |
| } |
|
|