Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion clients/cli/cmd/internal/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ func (cmd *InitCommand) newProject() error {
}

for {
err := prompt.P("Enter the name of the new project:", &params.Name)
err := prompt.Line("Enter the name of the new project:", &params.Name)
if err == nil {
break
}
Expand Down
22 changes: 19 additions & 3 deletions clients/cli/cmd/internal/prompt/prompt.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ package prompt
import (
"bufio"
"fmt"
"io"
"os"
"strings"
)

var stdin = bufio.NewReader(os.Stdin)
Expand All @@ -26,11 +26,27 @@ func P(msg string, args ...interface{}) error {
return err
}

// Line prints msg, then reads a line of user input. The input line is then cleaned of whitespace and assigned to val.
func Line(msg string, val *string) error {
fmt.Print(msg + " ")

line, err := stdin.ReadString('\n')
if err != nil {
return err
}

*val = strings.TrimSpace(line)
if *val == "" {
return fmt.Errorf("empty input")
}
return nil
}

// WithDefault prints msg, then parses a line of user input into
func WithDefault(msg string, arg *string, defaultValue string) error {
err := P(msg+" "+fmt.Sprintf("[default %v]", defaultValue), arg)
err := Line(msg+" "+fmt.Sprintf("[default %v]", defaultValue), arg)

if err == io.EOF {
if err != nil {
*arg = defaultValue
return nil
}
Expand Down
78 changes: 78 additions & 0 deletions clients/cli/cmd/internal/prompt/prompt_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package prompt

import (
"bufio"
"strings"
"testing"
)

func TestLine(t *testing.T) {
input := " My Project Name \n"
reader := bufio.NewReader(strings.NewReader(input))
oldStdin := stdin
defer func() { stdin = oldStdin }()
stdin = reader

var result string
err := Line("Prompt:", &result)
if err != nil {
t.Errorf("Line returned error: %v", err)
}

expected := "My Project Name"
if result != expected {
t.Errorf("Expected '%s', got '%s'", expected, result)
}
}

func TestLine_Empty(t *testing.T) {
input := "\n"
reader := bufio.NewReader(strings.NewReader(input))
oldStdin := stdin
defer func() { stdin = oldStdin }()
stdin = reader

var result string
err := Line("Prompt:", &result)
if err == nil {
t.Error("Line expected error for empty input, got nil")
}
}

func TestWithDefault_Default(t *testing.T) {
input := "\n"
reader := bufio.NewReader(strings.NewReader(input))
oldStdin := stdin
defer func() { stdin = oldStdin }()
stdin = reader

var result string
err := WithDefault("Prompt:", &result, "default")
if err != nil {
t.Errorf("WithDefault returned error: %v", err)
}

expected := "default"
if result != expected {
t.Errorf("Expected '%s', got '%s'", expected, result)
}
}

func TestWithDefault_Input(t *testing.T) {
input := "user input\n"
reader := bufio.NewReader(strings.NewReader(input))
oldStdin := stdin
defer func() { stdin = oldStdin }()
stdin = reader

var result string
err := WithDefault("Prompt:", &result, "default")
if err != nil {
t.Errorf("WithDefault returned error: %v", err)
}

expected := "user input"
if result != expected {
t.Errorf("Expected '%s', got '%s'", expected, result)
}
}
Loading