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 } }