diff --git a/pkg/cli/prompt.go b/pkg/cli/prompt.go index f95bec1..af01afd 100644 --- a/pkg/cli/prompt.go +++ b/pkg/cli/prompt.go @@ -42,11 +42,18 @@ func Prompt(label, defaultVal string) (string, error) { r := newReader() input, err := r.ReadString('\n') - if err != nil && !errors.Is(err, io.EOF) { - return "", err - } - input = strings.TrimSpace(input) + if err != nil { + if !errors.Is(err, io.EOF) { + return "", err + } + if input == "" { + if defaultVal != "" { + return defaultVal, nil + } + return "", err + } + } if input == "" { return defaultVal, nil } @@ -68,7 +75,7 @@ func Select(label string, options []string) (string, error) { r := newReader() input, err := r.ReadString('\n') if err != nil && strings.TrimSpace(input) == "" { - return "", err + return "", fmt.Errorf("selection cancelled: %w", err) } trimmed := strings.TrimSpace(input) diff --git a/pkg/cli/prompt_test.go b/pkg/cli/prompt_test.go index e72ac5e..c7cf643 100644 --- a/pkg/cli/prompt_test.go +++ b/pkg/cli/prompt_test.go @@ -36,6 +36,15 @@ func TestPrompt_Bad_EOFUsesDefault(t *testing.T) { assert.Equal(t, "world", val) } +func TestPrompt_Bad_EOFWithoutDefaultReturnsError(t *testing.T) { + SetStdin(strings.NewReader("")) + defer SetStdin(nil) + + val, err := Prompt("Name", "") + assert.ErrorIs(t, err, io.EOF) + assert.Empty(t, val) +} + func TestSelect_Good(t *testing.T) { SetStdin(strings.NewReader("2\n")) defer SetStdin(nil)