Skip to content

Commit 68e3f65

Browse files
committed
move auth init to go-prompt
1 parent b10687b commit 68e3f65

File tree

4 files changed

+127
-142
lines changed

4 files changed

+127
-142
lines changed

cmd/authInit.go

Lines changed: 65 additions & 141 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,15 @@ package cmd
1818
import (
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

6766
func 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("\nAre 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("\nTo exit early, type 'exit' or send EOF (ctrl+d)\n\n")); err != nil {
127-
return
128-
}
101+
fmt.Println("\nTo 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

go.mod

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,17 @@ module github.com/liquidweb/liquidweb-cli
33
go 1.13
44

55
require (
6+
github.com/c-bata/go-prompt v0.2.3
67
github.com/fsnotify/fsnotify v1.4.9 // indirect
78
github.com/liquidweb/go-lwApi v0.0.0-20190605172801-52a4864d2738
9+
github.com/mattn/go-colorable v0.1.6 // indirect
10+
github.com/mattn/go-runewidth v0.0.9 // indirect
11+
github.com/mattn/go-tty v0.0.3 // indirect
812
github.com/mitchellh/go-homedir v1.1.0
913
github.com/mitchellh/mapstructure v1.2.2
1014
github.com/pelletier/go-toml v1.6.0 // indirect
15+
github.com/pkg/term v0.0.0-20200520122047-c3ffed290a03 // indirect
16+
github.com/securego/gosec v0.0.0-20200401082031-e946c8c39989 // indirect
1117
github.com/spf13/afero v1.2.2 // indirect
1218
github.com/spf13/cast v1.3.1
1319
github.com/spf13/cobra v0.0.6

0 commit comments

Comments
 (0)