fix(cli): accept eof input in multi-select

Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
Virgil 2026-04-02 11:05:34 +00:00
parent d59e6acd72
commit f9bf2231e5
2 changed files with 12 additions and 3 deletions

View file

@ -102,14 +102,14 @@ func MultiSelect(label string, options []string) ([]string, error) {
r := newReader() r := newReader()
input, err := r.ReadString('\n') input, err := r.ReadString('\n')
if err != nil && strings.TrimSpace(input) == "" { trimmed := strings.TrimSpace(input)
if err != nil && trimmed == "" {
return []string{}, nil return []string{}, nil
} }
if err != nil { if err != nil && !errors.Is(err, io.EOF) {
return nil, err return nil, err
} }
trimmed := strings.TrimSpace(input)
selected, parseErr := parseMultiSelection(trimmed, len(options)) selected, parseErr := parseMultiSelection(trimmed, len(options))
if parseErr != nil { if parseErr != nil {
return nil, fmt.Errorf("invalid selection %q: %w", trimmed, parseErr) return nil, fmt.Errorf("invalid selection %q: %w", trimmed, parseErr)

View file

@ -137,6 +137,15 @@ func TestMultiSelect_Bad_EOFReturnsEmptySelection(t *testing.T) {
assert.Empty(t, vals) assert.Empty(t, vals)
} }
func TestMultiSelect_Good_EOFWithInput(t *testing.T) {
SetStdin(strings.NewReader("1 3"))
defer SetStdin(nil)
vals, err := MultiSelect("Pick", []string{"a", "b", "c"})
assert.NoError(t, err)
assert.Equal(t, []string{"a", "c"}, vals)
}
func TestMultiSelect_Good_DedupesSelections(t *testing.T) { func TestMultiSelect_Good_DedupesSelections(t *testing.T) {
SetStdin(strings.NewReader("1 1 2-3 2\n")) SetStdin(strings.NewReader("1 1 2-3 2\n"))
defer SetStdin(nil) defer SetStdin(nil)