sdt_trie_dcnt.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package hhc_ast
  2. import (
  3. "git.swzry.com/zry/go-hhc-cli/hhc_common"
  4. "github.com/derekparker/trie"
  5. )
  6. type SDT_TrieContainer struct {
  7. TrieTree *trie.Trie
  8. DataMap map[string]*SDTNode_Command
  9. }
  10. func NewSDT_TrieContainer() *SDT_TrieContainer {
  11. return &SDT_TrieContainer{
  12. TrieTree: trie.New(),
  13. DataMap: make(map[string]*SDTNode_Command),
  14. }
  15. }
  16. func (c *SDT_TrieContainer) Put(cmd *SDTNode_Command) {
  17. k := cmd.Name
  18. c.TrieTree.Add(k, nil)
  19. c.DataMap[k] = cmd
  20. }
  21. func (c *SDT_TrieContainer) ExactGet(key string) (*SDTNode_Command, bool) {
  22. v, ok := c.DataMap[key]
  23. return v, ok
  24. }
  25. func (c *SDT_TrieContainer) PrefixGetList(prefix string) []*SDTNode_Command {
  26. lst := make([]*SDTNode_Command, 0)
  27. kl := c.TrieTree.PrefixSearch(prefix)
  28. for _, v := range kl {
  29. ov, ok := c.DataMap[v]
  30. if ok {
  31. lst = append(lst, ov)
  32. }
  33. }
  34. return lst
  35. }
  36. func (c *SDT_TrieContainer) PrefixGetOne(prefix string) (*SDTNode_Command, bool, bool) {
  37. kl := c.TrieTree.PrefixSearch(prefix)
  38. if len(kl) == 0 {
  39. return nil, false, false
  40. }
  41. if len(kl) > 1 {
  42. return nil, true, false
  43. }
  44. v, ok := c.DataMap[kl[0]]
  45. if ok {
  46. return v, true, true
  47. }
  48. return nil, false, true
  49. }
  50. func (c *SDT_TrieContainer) WalkUtil(token string) (*SDTNode_Command, hhc_common.SDTWalkError) {
  51. v, okx := c.DataMap[token]
  52. if okx {
  53. return v, nil
  54. }
  55. v, ok1, ok2 := c.PrefixGetOne(token)
  56. if ok1 {
  57. if ok2 {
  58. if v != nil {
  59. return v, nil
  60. } else {
  61. return nil, hhc_common.SDTWalkError_NullPointerException{RelyToken: token, RelyEntity: "Commands"}
  62. }
  63. } else {
  64. return nil, hhc_common.SDTWalkError_TooShortPrefix{}
  65. }
  66. } else {
  67. return nil, nil
  68. }
  69. }