Merge pull request '[agent/codex:gpt-5.4-mini] Read ~/spec/code/core/go/cli/RFC.md fully. Find features des...' (#69) from agent/read---spec-code-core-go-cli-rfc-md-full into dev
All checks were successful
Security Scan / security (push) Successful in 19s

This commit is contained in:
Virgil 2026-04-02 10:29:47 +00:00
commit 37fdcdb7b4
2 changed files with 40 additions and 3 deletions

View file

@ -173,6 +173,30 @@ func TestChoose_Good_DefaultIndex(t *testing.T) {
assert.Equal(t, "b", val) assert.Equal(t, "b", val)
} }
func TestChoose_Good_EmptyRepromptsWithoutDefault(t *testing.T) {
SetStdin(strings.NewReader("\n2\n"))
defer SetStdin(nil)
val := Choose("Pick", []string{"a", "b", "c"})
assert.Equal(t, "b", val)
}
func TestChoose_Bad_EOFWithoutDefaultReturnsZeroValue(t *testing.T) {
SetStdin(strings.NewReader(""))
defer SetStdin(nil)
val := Choose("Pick", []string{"a", "b", "c"})
assert.Empty(t, val)
}
func TestChooseMulti_Good_EmptyWithoutDefaultReturnsNone(t *testing.T) {
SetStdin(strings.NewReader("\n"))
defer SetStdin(nil)
vals := ChooseMulti("Pick", []string{"a", "b", "c"})
assert.Empty(t, vals)
}
func TestChoose_Good_Filter(t *testing.T) { func TestChoose_Good_Filter(t *testing.T) {
SetStdin(strings.NewReader("ap\n2\n")) SetStdin(strings.NewReader("ap\n2\n"))
defer SetStdin(nil) defer SetStdin(nil)

View file

@ -337,6 +337,7 @@ func Choose[T any](prompt string, items []T, opts ...ChooseOption[T]) T {
cfg := &chooseConfig[T]{ cfg := &chooseConfig[T]{
displayFn: func(item T) string { return fmt.Sprint(item) }, displayFn: func(item T) string { return fmt.Sprint(item) },
defaultN: -1,
} }
for _, opt := range opts { for _, opt := range opts {
opt(cfg) opt(cfg)
@ -358,12 +359,23 @@ func Choose[T any](prompt string, items []T, opts ...ChooseOption[T]) T {
} else { } else {
fmt.Printf("Enter number [1-%d]: ", len(visible)) fmt.Printf("Enter number [1-%d]: ", len(visible))
} }
response, _ := reader.ReadString('\n') response, err := reader.ReadString('\n')
response = strings.TrimSpace(response) response = strings.TrimSpace(response)
// Empty response uses default. if err != nil && response == "" {
if cfg.defaultN >= 0 {
return items[defaultVisibleIndex(visible, cfg.defaultN)]
}
var zero T
return zero
}
if response == "" { if response == "" {
return items[defaultVisibleIndex(visible, cfg.defaultN)] if cfg.defaultN >= 0 {
return items[defaultVisibleIndex(visible, cfg.defaultN)]
}
fmt.Printf("Please enter a number between 1 and %d\n", len(visible))
continue
} }
var n int var n int
@ -415,6 +427,7 @@ func ChooseMulti[T any](prompt string, items []T, opts ...ChooseOption[T]) []T {
cfg := &chooseConfig[T]{ cfg := &chooseConfig[T]{
displayFn: func(item T) string { return fmt.Sprint(item) }, displayFn: func(item T) string { return fmt.Sprint(item) },
defaultN: -1,
} }
for _, opt := range opts { for _, opt := range opts {
opt(cfg) opt(cfg)