admin / context /trie.go
AZLABS's picture
Upload folder using huggingface_hub
530729e verified
// Copyright 2019 GoAdmin Core Team. All rights reserved.
// Use of this source code is governed by a Apache-2.0 style
// license that can be found in the LICENSE file.
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
}