-
Notifications
You must be signed in to change notification settings - Fork 7
/
prompt.go
187 lines (152 loc) · 4.24 KB
/
prompt.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
package stim
import (
"os"
"regexp"
"strings"
"github.com/chzyer/readline"
"github.com/manifoldco/promptui"
)
// noBellStderr implements an io.WriteCloser that skips the terminal bell character
// (ASCII code 7), and writes the rest to os.Stderr. It's used to replace
// readline.Stdout, that is the package used by promptui to display the prompts.
type noBellStderr struct{}
// Write implements an io.WriterCloser over os.Stderr, but it skips the terminal
// bell character.
func (s *noBellStderr) Write(b []byte) (int, error) {
if len(b) == 1 && b[0] == readline.CharBell {
return 0, nil
}
return os.Stderr.Write(b)
}
// Close implements an io.WriterCloser over os.Stderr.
func (s *noBellStderr) Close() error {
return os.Stderr.Close()
}
func init() {
readline.Stdout = &noBellStderr{}
}
// PromptBool asks the user a yes/no question
func (stim *Stim) PromptBool(label string, override bool, defaultvalue bool) (bool, error) {
if override {
stim.Debug("PromptString: Using override value of `true`")
return true, nil
}
y := "y"
n := "n"
if defaultvalue {
y = strings.ToUpper(y)
} else {
n = strings.ToUpper(n)
}
label = label + " (" + y + "/" + n + ")"
prompt := promptui.Prompt{
Label: label,
}
result, err := prompt.Run()
if err != nil {
return false, err
}
if result == "" {
return defaultvalue, nil
}
if strings.ToLower(strings.TrimSpace(result))[0:1] == "y" {
return true, nil
}
return false, nil
}
// PromptString prompts the user to enter a string
func (stim *Stim) PromptString(label string, defaultvalue string) (string, error) {
defaultstring := ""
if defaultvalue != "" {
defaultstring = "[" + defaultvalue + "] "
}
label = label + " " + defaultstring + ""
prompt := promptui.Prompt{
Label: label,
}
result, err := prompt.Run()
if err != nil {
return "", err
}
if result == "" {
return defaultvalue, nil
}
return result, nil
}
// PromptList prompts the user to select from the list of string provided
// If override string is not empty it will be returned without
func (stim *Stim) PromptList(label string, list []string, override string) (string, error) {
if override != "" {
stim.Debug("PromptList: Using override value of `" + override + "`")
return override, nil
}
prompt := promptui.Select{
Label: label,
Items: list,
Size: 10,
}
_, result, err := prompt.Run()
if err != nil {
return "", err
}
return result, nil
}
// PromptListVault uses a path from vault and prompts to select the list
// of secrets within that list. Returns the value selected.
// If override string is not empty it will be returned without
func (stim *Stim) PromptListVault(vaultPath string, label string, defaultedValue string, regex string) (string, error) {
vaultScanPath := vaultPath
if defaultedValue != "" {
return defaultedValue, nil
}
stim.log.Debug("PromptListVault: Using value of \"{}\"", vaultScanPath)
vault := stim.Vault()
list, err := vault.ListSecrets(vaultScanPath)
if err != nil {
return "", err
}
listRegex := make([]string, 0)
if regex != "" {
stim.log.Debug("Doing Regex on vault list: \"{}\"", regex)
matcher, err := regexp.Compile(regex)
if err != nil {
stim.log.Warn("Problem parsing regex filter:\"{}\", err:{}, skipping regex.", regex, err)
listRegex = list
} else {
for _, v := range list {
if matcher.MatchString(v) {
listRegex = append(listRegex, v)
}
}
}
} else {
listRegex = list
}
result, err := stim.PromptList(label, listRegex, "")
if err != nil {
return "", err
}
return result, nil
}
// PromptSearchList takes a label, list of selectable values and prompts the user
// to select the results. If override string is not empty it will be returned without
// prompting
func (stim *Stim) PromptSearchList(label string, list []string) (string, error) {
searcher := func(input string, index int) bool {
name := strings.Replace(strings.ToLower(list[index]), " ", "", -1)
input = strings.Replace(strings.ToLower(input), " ", "", -1)
return strings.Contains(name, input)
}
prompt := promptui.Select{
Label: label,
Items: list,
Size: 10,
Searcher: searcher,
StartInSearchMode: true,
}
_, result, err := prompt.Run()
if err != nil {
return "", err
}
return result, nil
}