1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- package hhc_ast
- import (
- "git.swzry.com/zry/go-hhc-cli/hhc_common"
- "github.com/derekparker/trie"
- )
- type SDT_TrieContainer struct {
- TrieTree *trie.Trie
- DataMap map[string]*SDTNode_Command
- }
- func NewSDT_TrieContainer() *SDT_TrieContainer {
- return &SDT_TrieContainer{
- TrieTree: trie.New(),
- DataMap: make(map[string]*SDTNode_Command),
- }
- }
- func (c *SDT_TrieContainer) Put(cmd *SDTNode_Command) {
- k := cmd.Name
- c.TrieTree.Add(k, nil)
- c.DataMap[k] = cmd
- }
- func (c *SDT_TrieContainer) ExactGet(key string) (*SDTNode_Command, bool) {
- v, ok := c.DataMap[key]
- return v, ok
- }
- func (c *SDT_TrieContainer) PrefixGetList(prefix string) []*SDTNode_Command {
- lst := make([]*SDTNode_Command, 0)
- kl := c.TrieTree.PrefixSearch(prefix)
- for _, v := range kl {
- ov, ok := c.DataMap[v]
- if ok {
- lst = append(lst, ov)
- }
- }
- return lst
- }
- func (c *SDT_TrieContainer) PrefixGetOne(prefix string) (*SDTNode_Command, bool, bool) {
- kl := c.TrieTree.PrefixSearch(prefix)
- if len(kl) == 0 {
- return nil, false, false
- }
- if len(kl) > 1 {
- return nil, true, false
- }
- v, ok := c.DataMap[kl[0]]
- if ok {
- return v, true, true
- }
- return nil, false, true
- }
- func (c *SDT_TrieContainer) WalkUtil(token string) (*SDTNode_Command, hhc_common.SDTWalkError) {
- v, okx := c.DataMap[token]
- if okx {
- return v, nil
- }
- v, ok1, ok2 := c.PrefixGetOne(token)
- if ok1 {
- if ok2 {
- if v != nil {
- return v, nil
- } else {
- return nil, hhc_common.SDTWalkError_NullPointerException{RelyToken: token, RelyEntity: "Commands"}
- }
- } else {
- return nil, hhc_common.SDTWalkError_TooShortPrefix{}
- }
- } else {
- return nil, nil
- }
- }
|