fix(cli): support comma and range multi-select input
All checks were successful
Security Scan / security (push) Successful in 23s

This commit is contained in:
Virgil 2026-04-02 04:40:23 +00:00
parent b1850124de
commit 9fd432aed3
2 changed files with 29 additions and 3 deletions

View file

@ -87,9 +87,26 @@ func MultiSelect(label string, options []string) ([]string, error) {
} }
var selected []string var selected []string
for _, s := range strings.Fields(input) { normalized := strings.NewReplacer(",", " ").Replace(input)
n, err := strconv.Atoi(s) for _, s := range strings.Fields(normalized) {
if err != nil || n < 1 || n > len(options) { if strings.Contains(s, "-") {
parts := strings.SplitN(s, "-", 2)
if len(parts) != 2 {
continue
}
start, startErr := strconv.Atoi(parts[0])
end, endErr := strconv.Atoi(parts[1])
if startErr != nil || endErr != nil || start < 1 || end > len(options) || start > end {
continue
}
for n := start; n <= end; n++ {
selected = append(selected, options[n-1])
}
continue
}
n, convErr := strconv.Atoi(s)
if convErr != nil || n < 1 || n > len(options) {
continue continue
} }
selected = append(selected, options[n-1]) selected = append(selected, options[n-1])

View file

@ -52,6 +52,15 @@ func TestMultiSelect_Good(t *testing.T) {
assert.Equal(t, []string{"a", "c"}, vals) assert.Equal(t, []string{"a", "c"}, vals)
} }
func TestMultiSelect_Good_CommasAndRanges(t *testing.T) {
SetStdin(strings.NewReader("1-2,4\n"))
defer SetStdin(nil)
vals, err := MultiSelect("Pick", []string{"a", "b", "c", "d"})
assert.NoError(t, err)
assert.Equal(t, []string{"a", "b", "d"}, vals)
}
func TestConfirm_Good(t *testing.T) { func TestConfirm_Good(t *testing.T) {
SetStdin(strings.NewReader("y\n")) SetStdin(strings.NewReader("y\n"))
defer SetStdin(nil) defer SetStdin(nil)