-
Notifications
You must be signed in to change notification settings - Fork 113
/
prompt.go
128 lines (110 loc) · 2.45 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
package cmdutil
import (
"fmt"
"os"
"slices"
"strconv"
"strings"
"github.com/AlecAivazis/survey/v2"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
)
func SelectPrompt(msg string, options []string, def string) string {
prompt := &survey.Select{
Message: msg,
Options: options,
}
if slices.Contains(options, def) {
prompt.Default = def
}
result := ""
if err := survey.AskOne(prompt, &result); err != nil {
fmt.Printf("Prompt failed %v\n", err)
os.Exit(1)
}
return result
}
func ConfirmPrompt(msg, help string, def bool) bool {
prompt := &survey.Confirm{
Message: msg,
Default: def,
}
if help != "" {
prompt.Help = help
}
result := def
if err := survey.AskOne(prompt, &result); err != nil {
fmt.Printf("Prompt failed %v\n", err)
os.Exit(1)
}
return result
}
func InputPrompt(msg, def string) (string, error) {
prompt := &survey.Input{
Message: msg,
Default: def,
}
result := def
if err := survey.AskOne(prompt, &result); err != nil {
fmt.Printf("Prompt failed %v\n", err)
return "", err
}
return strings.TrimSpace(result), nil
}
func StringPromptIfEmpty(input *string, msg string) {
if *input != "" {
return
}
prompt := []*survey.Question{{
Prompt: &survey.Input{Message: msg},
Validate: survey.Required,
}}
if err := survey.Ask(prompt, input); err != nil {
fmt.Printf("Prompt failed %v\n", err)
os.Exit(1)
}
*input = strings.TrimSpace(*input)
}
func SelectPromptIfEmpty(input *string, msg string, options []string, def string) {
if *input != "" {
return
}
*input = SelectPrompt(msg, options, def)
}
func SetFlagsByInputPrompts(cmd cobra.Command, flags ...string) error {
var err error
var val string
cmd.Flags().VisitAll(func(f *pflag.Flag) {
if !f.Changed && slices.Contains(flags, f.Name) {
switch f.Value.Type() {
case "bool":
var public bool
defVal, err := strconv.ParseBool(f.DefValue)
if err != nil {
return
}
prompt := &survey.Confirm{
Message: fmt.Sprintf("Confirm \"%s\"?", f.Usage),
Default: defVal,
}
err = survey.AskOne(prompt, &public)
if err != nil {
return
}
val = fmt.Sprintf("%t", public)
default:
val, err = InputPrompt(fmt.Sprintf("Enter the %s", f.Usage), f.DefValue)
if err != nil {
fmt.Println("error while input prompt, error:", err)
return
}
}
err = f.Value.Set(val)
if err != nil {
fmt.Println("error while setting values, error:", err)
return
}
}
})
return err
}