@@ -54,61 +54,103 @@ var opt = []prompt.Suggest{
5454}
5555
5656func Complete (d prompt.Document ) []prompt.Suggest {
57- args := strings .Split (d .TextBeforeCursor (), " " )
57+ args := completionArgs (d )
58+ word := d .GetWordBeforeCursor ()
5859 if len (args ) <= 1 {
59- return prompt .FilterHasPrefix (core , d . GetWordBeforeCursor () , true )
60+ return prompt .FilterHasPrefix (core , word , true )
6061 }
6162 switch args [0 ] {
63+ case "help" :
64+ return helpSuggestions (args , word )
6265 case "use" :
6366 if len (args ) == 2 {
64- return prompt .FilterContains (modules , d . GetWordBeforeCursor () , true )
67+ return prompt .FilterContains (modules , word , true )
6568 }
6669 }
6770 return []prompt.Suggest {}
6871}
6972
7073func actionCompleter (d prompt.Document ) []prompt.Suggest {
71- args := strings .Split (d .TextBeforeCursor (), " " )
74+ args := completionArgs (d )
75+ word := d .GetWordBeforeCursor ()
7276 if len (args ) <= 1 {
73- return prompt .FilterHasPrefix (append (core , action ... ), d . GetWordBeforeCursor () , true )
77+ return prompt .FilterHasPrefix (append (core , action ... ), word , true )
7478 }
7579 switch args [0 ] {
80+ case "help" :
81+ return helpSuggestions (args , word )
7682 case "use" :
7783 if len (args ) == 2 {
78- return prompt .FilterContains (modules , d . GetWordBeforeCursor () , true )
84+ return prompt .FilterContains (modules , word , true )
7985 }
8086 case "show" :
8187 if len (args ) == 2 {
82- return prompt .FilterContains (opt , d . GetWordBeforeCursor () , true )
88+ return prompt .FilterContains (opt , word , true )
8389 }
8490 case "set" :
8591 if len (args ) == 2 {
86- getOpt := func () (p []prompt.Suggest ) {
87- for k := range config {
88- if v , ok := optionsDesc [k ]; ok { // && k != utils.Provider
89- p = append (p , prompt.Suggest {Text : k , Description : v })
90- }
91- }
92- return
93- }()
94- return prompt .FilterContains (getOpt , d .GetWordBeforeCursor (), true )
92+ return prompt .FilterContains (optionSuggestions (), word , true )
9593 }
9694 if len (args ) == 3 && args [1 ] == utils .Payload {
97- getPayloads := func () (p []prompt.Suggest ) {
98- for _ , entry := range payloads .Visible () {
99- p = append (p , prompt.Suggest {Text : entry .Name , Description : entry .Payload .Desc ()})
100- }
101- return
102- }()
103- return prompt .FilterContains (getPayloads , d .GetWordBeforeCursor (), true )
95+ return prompt .FilterContains (payloadSuggestions (), word , true )
10496 }
10597 if len (args ) == 3 && args [1 ] == utils .Version {
10698 var versions = []prompt.Suggest {
10799 {Text : "Intl" , Description : "International Edition" },
108100 {Text : "China" , Description : "Chinese Edition" },
109101 }
110- return prompt .FilterContains (versions , d . GetWordBeforeCursor () , true )
102+ return prompt .FilterContains (versions , word , true )
111103 }
112104 }
113105 return []prompt.Suggest {}
114106}
107+
108+ func completionArgs (d prompt.Document ) []string {
109+ text := d .TextBeforeCursor ()
110+ args := strings .Fields (text )
111+ if strings .HasSuffix (text , " " ) || strings .HasSuffix (text , "\t " ) {
112+ args = append (args , "" )
113+ }
114+ return args
115+ }
116+
117+ func helpSuggestions (args []string , word string ) []prompt.Suggest {
118+ if len (args ) == 2 {
119+ return prompt .FilterContains (helpTopicSuggestions (), word , true )
120+ }
121+ if len (args ) == 3 && (args [1 ] == "payload" || args [1 ] == "metadata" ) {
122+ return prompt .FilterContains (payloadSuggestions (), word , true )
123+ }
124+ return []prompt.Suggest {}
125+ }
126+
127+ func helpTopicSuggestions () []prompt.Suggest {
128+ suggestions := make ([]prompt.Suggest , 0 , len (helpTopicOrder ))
129+ for _ , key := range helpTopicOrder {
130+ if topic , ok := helpTopics [key ]; ok {
131+ suggestions = append (suggestions , prompt.Suggest {
132+ Text : key ,
133+ Description : topic .Summary ,
134+ })
135+ }
136+ }
137+ return suggestions
138+ }
139+
140+ func optionSuggestions () []prompt.Suggest {
141+ suggestions := make ([]prompt.Suggest , 0 , len (config ))
142+ for k := range config {
143+ if v , ok := optionsDesc [k ]; ok {
144+ suggestions = append (suggestions , prompt.Suggest {Text : k , Description : v })
145+ }
146+ }
147+ return suggestions
148+ }
149+
150+ func payloadSuggestions () []prompt.Suggest {
151+ suggestions := make ([]prompt.Suggest , 0 , len (payloads .Visible ()))
152+ for _ , entry := range payloads .Visible () {
153+ suggestions = append (suggestions , prompt.Suggest {Text : entry .Name , Description : entry .Payload .Desc ()})
154+ }
155+ return suggestions
156+ }
0 commit comments