@@ -18,16 +18,15 @@ package cmd
1818import (
1919 "bytes"
2020 "fmt"
21- "io"
2221 "os"
22+ "strings"
2323
2424 "golang.org/x/crypto/ssh/terminal"
2525
26- "github.com/spf13/cast "
26+ "github.com/c-bata/go-prompt "
2727 "github.com/spf13/cobra"
2828
2929 "github.com/liquidweb/liquidweb-cli/types/cmd"
30- "github.com/liquidweb/liquidweb-cli/types/errors"
3130 "github.com/liquidweb/liquidweb-cli/utils"
3231 "github.com/liquidweb/liquidweb-cli/validate"
3332)
@@ -65,218 +64,143 @@ func setAuthDataInteractively() error {
6564}
6665
6766func fetchAuthDataInteractively () (writeConfig bool , err error ) {
68- if ! terminal .IsTerminal (0 ) || ! terminal .IsTerminal (1 ) {
69- err = errorTypes .UnknownTerminal
70- return
71- }
72- oldState , termMakeErr := terminal .MakeRaw (0 )
73- if termMakeErr != nil {
74- err = termMakeErr
75- return
76- }
77- defer terminal .Restore (0 , oldState )
78- screen := struct {
79- io.Reader
80- io.Writer
81- }{os .Stdin , os .Stdout }
82- term := terminal .NewTerminal (screen , "" )
83- term .SetPrompt (cast .ToString (term .Escape .Blue ) + " > " + cast .ToString (term .Escape .Reset ))
84-
85- moreAdds := false
86-
87- // warn before deleting config
88- var haveProceedAnswer bool
67+ var (
68+ moreAdds bool
69+ haveProceedAnswer bool
70+ )
71+
8972 for ! haveProceedAnswer {
90- if _ , err = term .Write ([]byte ("Warning: This will delete all auth contexts. Continue (yes/[no])?: " )); err != nil {
91- return
92- }
93- proceedBytes , readErr := term .ReadLine ()
94- if readErr != nil {
95- err = readErr
96- return
97- }
98- proceedString := cast .ToString (proceedBytes )
99- if proceedString != "yes" && proceedString != "no" && proceedString != "" {
100- if _ , err = term .Write ([]byte ("invalid input.\n " )); err != nil {
101- return
73+ f := func (d prompt.Document ) []prompt.Suggest {
74+ s := []prompt.Suggest {
75+ {Text : "yes" , Description : "delete all auth contexts" },
76+ {Text : "no" , Description : "keep my auth contexts and exit" },
10277 }
103- continue
78+ return prompt . FilterHasPrefix ( s , d . GetWordBeforeCursor (), true )
10479 }
105-
106- if proceedString == "yes" {
80+ fmt .Println ("Warning: If you proceed, any set auth context will be deleted." )
81+ fmt .Print ("\n Are you sure? " )
82+ answer := strings .ToLower (prompt .Input ("> " , f , prompt .OptionShowCompletionAtStart ()))
83+ if answer == "yes" {
10784 moreAdds = true
10885 haveProceedAnswer = true
109- } else if proceedString == "" || proceedString == "no" {
86+ } else if answer == "no" {
11087 haveProceedAnswer = true
11188 moreAdds = false
11289 }
11390 }
11491
115- // return if user didnt acknowledge to proceed
11692 if ! moreAdds {
11793 return
11894 }
11995
120- // create context add loop channels
12196 userInputComplete := make (chan bool )
12297 userInputError := make (chan error )
12398 userInputExitEarly := make (chan bool )
12499 userInputContext := make (chan cmdTypes.AuthContext )
125100
126- if _ , err = term .Write ([]byte ("\n To exit early, type 'exit' or send EOF (ctrl+d)\n \n " )); err != nil {
127- return
128- }
101+ fmt .Println ("\n To exit early, type 'exit'\n " )
129102
130- // start context add loop
131103 go func () {
132104 WHILEMOREADDS:
133105 for moreAdds {
134106 var (
135107 context cmdTypes.AuthContext
136- contextNameAnswer string
137108 haveContextNameAnswer bool
138- usernameAnswer string
139109 haveUsernameAnswer bool
140- passwordAnswer string
141110 havePasswordAnswer bool
142111 haveMakeCurrentContextAnswer bool
143112 haveMoreContextsToAddAnswer bool
144113 )
145114
146115 // context name
147116 for ! haveContextNameAnswer {
148- if _ , err := term .Write ([]byte ("Name this context: " )); err != nil {
149- userInputError <- err
150- break WHILEMOREADDS
151- }
152- contextNameBytes , err := term .ReadLine ()
153- if err != nil {
154- userInputError <- err
155- break WHILEMOREADDS
156- }
157- contextNameAnswer = cast .ToString (contextNameBytes )
158- if contextNameAnswer == "exit" {
117+ fmt .Print ("Name this context: " )
118+ answer := strings .ToLower (prompt .Input ("> " , func (d prompt.Document ) (s []prompt.Suggest ) { return }))
119+ if answer == "exit" {
159120 userInputExitEarly <- true
160121 break WHILEMOREADDS
161- } else if contextNameAnswer == "" {
162- if _ , err := term .Write ([]byte ("context name cannot be blank.\n " )); err != nil {
163- userInputError <- err
164- break WHILEMOREADDS
165- }
166- } else {
122+ } else if answer != "" {
167123 haveContextNameAnswer = true
168- context .ContextName = contextNameAnswer
124+ context .ContextName = answer
169125 }
170126 }
171127
172128 // username
173129 for ! haveUsernameAnswer {
174- if _ , err := term .Write ([]byte ("LiquidWeb username: " )); err != nil {
175- userInputError <- err
176- break WHILEMOREADDS
177- }
178- usernameBytes , err := term .ReadLine ()
179- if err != nil {
180- userInputError <- err
181- break WHILEMOREADDS
182- }
183- usernameAnswer = cast .ToString (usernameBytes )
184- if usernameAnswer == "exit" {
130+ fmt .Print ("LiquidWeb username: " )
131+ answer := prompt .Input ("> " , func (d prompt.Document ) (s []prompt.Suggest ) { return })
132+ if answer == "exit" {
185133 userInputExitEarly <- true
186134 break WHILEMOREADDS
187- } else if usernameAnswer == "" {
188- if _ , err := term .Write ([]byte ("username cannot be blank.\n " )); err != nil {
189- userInputError <- err
190- break WHILEMOREADDS
191- }
192- } else {
135+ } else if answer != "" {
193136 haveUsernameAnswer = true
194- context .Username = usernameAnswer
137+ context .Username = answer
195138 }
196139 }
197140
198141 // password
199142 for ! havePasswordAnswer {
200- passwordBytes , err := term .ReadPassword ("LiquidWeb password: " )
143+ fmt .Print ("LiquidWeb password: " )
144+ passwordBytes , err := terminal .ReadPassword (0 )
201145 if err != nil {
202146 userInputError <- err
203147 break WHILEMOREADDS
204148 }
205- passwordAnswer = cast .ToString (passwordBytes )
206- if passwordAnswer == "exit" {
149+ answer := string (passwordBytes )
150+ //answer := prompt.Input("> ", func(d prompt.Document) (s []prompt.Suggest) { return })
151+ if answer == "exit" {
207152 userInputExitEarly <- true
208153 break WHILEMOREADDS
209- } else if passwordAnswer == "" {
210- if _ , err := term .Write ([]byte ("password cannot be blank.\n " )); err != nil {
211- userInputError <- err
212- break WHILEMOREADDS
213- }
214- } else {
154+ } else if answer != "" {
215155 havePasswordAnswer = true
216- context .Password = passwordAnswer
156+ context .Password = answer
217157 }
158+ fmt .Println ("" )
218159 }
219160
220161 // make current context?
221162 for ! haveMakeCurrentContextAnswer {
222- if _ , err := term .Write ([]byte ("Make current context? ([yes]/no)" )); err != nil {
223- userInputError <- err
224- break WHILEMOREADDS
225- }
226- makeCurrentContextBytes , err := term .ReadLine ()
227- if err != nil {
228- userInputError <- err
229- break WHILEMOREADDS
163+ f := func (d prompt.Document ) []prompt.Suggest {
164+ s := []prompt.Suggest {
165+ {Text : "yes" , Description : "Make this my default context" },
166+ {Text : "no" , Description : "I will switch to this context when I need it" },
167+ }
168+ return prompt .FilterHasPrefix (s , d .GetWordBeforeCursor (), true )
230169 }
231- makeCurrentContextString := cast .ToString (makeCurrentContextBytes )
232- if makeCurrentContextString == "exit" {
170+ fmt .Print ("Make current context? " )
171+ answer := strings .ToLower (prompt .Input ("> " , f , prompt .OptionShowCompletionAtStart ()))
172+ if answer == "yes" || answer == "no" {
173+ haveMakeCurrentContextAnswer = true
174+ if answer == "yes" {
175+ context .CurrentContext = true
176+ }
177+ } else if answer == "exit" {
233178 userInputExitEarly <- true
234179 break WHILEMOREADDS
235180 }
236- if makeCurrentContextString != "" && makeCurrentContextString != "yes" && makeCurrentContextString != "no" {
237- if _ , err := term .Write ([]byte ("invalid input.\n " )); err != nil {
238- userInputError <- err
239- break WHILEMOREADDS
240- }
241- continue
242- }
243-
244- haveMakeCurrentContextAnswer = true
245- if makeCurrentContextString == "yes" || makeCurrentContextString == "" {
246- context .CurrentContext = true
247- }
248181 }
249182
250183 // more contexts to add ?
251184 for ! haveMoreContextsToAddAnswer {
252- if _ , err := term .Write ([]byte ("Add another context? (yes/[no]): " )); err != nil {
253- userInputError <- err
254- break WHILEMOREADDS
255- }
256- moreContextsBytes , err := term .ReadLine ()
257- if err != nil {
258- userInputError <- err
259- break WHILEMOREADDS
260- }
261-
262- answer := cast .ToString (moreContextsBytes )
263- if answer == "exit" {
264- userInputExitEarly <- true
265- break WHILEMOREADDS
266- }
267- if answer != "" && answer != "yes" && answer != "no" {
268- if _ , err := term .Write ([]byte ("invalid input.\n " )); err != nil {
269- userInputError <- err
270- break WHILEMOREADDS
185+ f := func (d prompt.Document ) []prompt.Suggest {
186+ s := []prompt.Suggest {
187+ {Text : "yes" , Description : "I have more auth contexts to add" },
188+ {Text : "no" , Description : "I'm all done adding auth contexts" },
271189 }
272- continue
190+ return prompt . FilterHasPrefix ( s , d . GetWordBeforeCursor (), true )
273191 }
274-
275- if answer == "no" || answer == "" {
192+ fmt .Print ("Add another context? " )
193+ answer := strings .ToLower (prompt .Input ("> " , f , prompt .OptionShowCompletionAtStart ()))
194+ if answer == "no" {
195+ haveMoreContextsToAddAnswer = true
276196 moreAdds = false
197+ } else if answer == "yes" {
198+ haveMoreContextsToAddAnswer = true
199+ moreAdds = true
200+ } else if answer == "exit" {
201+ userInputExitEarly <- true
202+ break WHILEMOREADDS
277203 }
278-
279- haveMoreContextsToAddAnswer = true
280204 }
281205
282206 // when these defaults are unsuitable, see `auth update-context` to change it later
0 commit comments