76 lines
1.6 KiB
Go
76 lines
1.6 KiB
Go
|
|
package cli
|
||
|
|
|
||
|
|
import (
|
||
|
|
"bufio"
|
||
|
|
"fmt"
|
||
|
|
"os"
|
||
|
|
"strconv"
|
||
|
|
"strings"
|
||
|
|
)
|
||
|
|
|
||
|
|
var stdin = bufio.NewReader(os.Stdin)
|
||
|
|
|
||
|
|
// Prompt asks for text input with a default value.
|
||
|
|
func Prompt(label, defaultVal string) (string, error) {
|
||
|
|
if defaultVal != "" {
|
||
|
|
fmt.Printf("%s [%s]: ", label, defaultVal)
|
||
|
|
} else {
|
||
|
|
fmt.Printf("%s: ", label)
|
||
|
|
}
|
||
|
|
|
||
|
|
input, err := stdin.ReadString('\n')
|
||
|
|
if err != nil {
|
||
|
|
return "", err
|
||
|
|
}
|
||
|
|
|
||
|
|
input = strings.TrimSpace(input)
|
||
|
|
if input == "" {
|
||
|
|
return defaultVal, nil
|
||
|
|
}
|
||
|
|
return input, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// Select presents numbered options and returns the selected value.
|
||
|
|
func Select(label string, options []string) (string, error) {
|
||
|
|
fmt.Println(label)
|
||
|
|
for i, opt := range options {
|
||
|
|
fmt.Printf(" %d. %s\n", i+1, opt)
|
||
|
|
}
|
||
|
|
fmt.Printf("Choose [1-%d]: ", len(options))
|
||
|
|
|
||
|
|
input, err := stdin.ReadString('\n')
|
||
|
|
if err != nil {
|
||
|
|
return "", err
|
||
|
|
}
|
||
|
|
|
||
|
|
n, err := strconv.Atoi(strings.TrimSpace(input))
|
||
|
|
if err != nil || n < 1 || n > len(options) {
|
||
|
|
return "", fmt.Errorf("invalid selection")
|
||
|
|
}
|
||
|
|
return options[n-1], nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// MultiSelect presents checkboxes (space-separated numbers).
|
||
|
|
func MultiSelect(label string, options []string) ([]string, error) {
|
||
|
|
fmt.Println(label)
|
||
|
|
for i, opt := range options {
|
||
|
|
fmt.Printf(" %d. %s\n", i+1, opt)
|
||
|
|
}
|
||
|
|
fmt.Printf("Choose (space-separated) [1-%d]: ", len(options))
|
||
|
|
|
||
|
|
input, err := stdin.ReadString('\n')
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
|
||
|
|
var selected []string
|
||
|
|
for _, s := range strings.Fields(input) {
|
||
|
|
n, err := strconv.Atoi(s)
|
||
|
|
if err != nil || n < 1 || n > len(options) {
|
||
|
|
continue
|
||
|
|
}
|
||
|
|
selected = append(selected, options[n-1])
|
||
|
|
}
|
||
|
|
return selected, nil
|
||
|
|
}
|