Skip to content
Draft
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
73 changes: 49 additions & 24 deletions internal/iostreams/charm.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,38 +24,47 @@ import (
"github.com/charmbracelet/huh"
)

// charmInputPrompt prompts for text input using a charm huh form
func charmInputPrompt(_ *IOStreams, _ context.Context, message string, cfg InputPromptConfig) (string, error) {
var input string
// buildInputForm constructs a huh form for text input prompts.
func buildInputForm(message string, cfg InputPromptConfig, input *string) *huh.Form {
field := huh.NewInput().
Title(message).
Value(&input)
Value(input)
if cfg.Required {
field.Validate(huh.ValidateMinLength(1))
}
err := huh.NewForm(huh.NewGroup(field)).Run()
return huh.NewForm(huh.NewGroup(field)).WithTheme(ThemeSlack())
}

// charmInputPrompt prompts for text input using a charm huh form
func charmInputPrompt(_ *IOStreams, _ context.Context, message string, cfg InputPromptConfig) (string, error) {
var input string
err := buildInputForm(message, cfg, &input).Run()
if err != nil {
return "", err
}
return input, nil
}

// buildConfirmForm constructs a huh form for yes/no confirmation prompts.
func buildConfirmForm(message string, choice *bool) *huh.Form {
field := huh.NewConfirm().
Title(message).
Value(choice)
return huh.NewForm(huh.NewGroup(field)).WithTheme(ThemeSlack())
}

// charmConfirmPrompt prompts for a yes/no confirmation using a charm huh form
func charmConfirmPrompt(_ *IOStreams, _ context.Context, message string, defaultValue bool) (bool, error) {
var choice = defaultValue
field := huh.NewConfirm().
Title(message).
Value(&choice)
err := huh.NewForm(huh.NewGroup(field)).Run()
err := buildConfirmForm(message, &choice).Run()
if err != nil {
return false, err
}
return choice, nil
}

// charmSelectPrompt prompts the user to select one option using a charm huh form
func charmSelectPrompt(_ *IOStreams, _ context.Context, msg string, options []string, cfg SelectPromptConfig) (SelectPromptResponse, error) {
var selected string
// buildSelectForm constructs a huh form for single-selection prompts.
func buildSelectForm(msg string, options []string, cfg SelectPromptConfig, selected *string) *huh.Form {
var opts []huh.Option[string]
for _, opt := range options {
key := opt
Expand All @@ -70,13 +79,19 @@ func charmSelectPrompt(_ *IOStreams, _ context.Context, msg string, options []st
field := huh.NewSelect[string]().
Title(msg).
Options(opts...).
Value(&selected)
Value(selected)

if cfg.PageSize > 0 {
field.Height(cfg.PageSize + 2)
}

err := huh.NewForm(huh.NewGroup(field)).Run()
return huh.NewForm(huh.NewGroup(field)).WithTheme(ThemeSlack())
}

// charmSelectPrompt prompts the user to select one option using a charm huh form
func charmSelectPrompt(_ *IOStreams, _ context.Context, msg string, options []string, cfg SelectPromptConfig) (SelectPromptResponse, error) {
var selected string
err := buildSelectForm(msg, options, cfg, &selected).Run()
if err != nil {
return SelectPromptResponse{}, err
}
Expand All @@ -85,26 +100,30 @@ func charmSelectPrompt(_ *IOStreams, _ context.Context, msg string, options []st
return SelectPromptResponse{Prompt: true, Index: index, Option: selected}, nil
}

// charmPasswordPrompt prompts for a password (hidden input) using a charm huh form
func charmPasswordPrompt(_ *IOStreams, _ context.Context, message string, cfg PasswordPromptConfig) (PasswordPromptResponse, error) {
var input string
// buildPasswordForm constructs a huh form for password (hidden input) prompts.
func buildPasswordForm(message string, cfg PasswordPromptConfig, input *string) *huh.Form {
field := huh.NewInput().
Title(message).
EchoMode(huh.EchoModePassword).
Value(&input)
Value(input)
if cfg.Required {
field.Validate(huh.ValidateMinLength(1))
}
err := huh.NewForm(huh.NewGroup(field)).Run()
return huh.NewForm(huh.NewGroup(field)).WithTheme(ThemeSlack())
}

// charmPasswordPrompt prompts for a password (hidden input) using a charm huh form
func charmPasswordPrompt(_ *IOStreams, _ context.Context, message string, cfg PasswordPromptConfig) (PasswordPromptResponse, error) {
var input string
err := buildPasswordForm(message, cfg, &input).Run()
if err != nil {
return PasswordPromptResponse{}, err
}
return PasswordPromptResponse{Prompt: true, Value: input}, nil
}

// charmMultiSelectPrompt prompts the user to select multiple options using a charm huh form
func charmMultiSelectPrompt(_ *IOStreams, _ context.Context, message string, options []string) ([]string, error) {
var selected []string
// buildMultiSelectForm constructs a huh form for multiple-selection prompts.
func buildMultiSelectForm(message string, options []string, selected *[]string) *huh.Form {
var opts []huh.Option[string]
for _, opt := range options {
opts = append(opts, huh.NewOption(opt, opt))
Expand All @@ -113,9 +132,15 @@ func charmMultiSelectPrompt(_ *IOStreams, _ context.Context, message string, opt
field := huh.NewMultiSelect[string]().
Title(message).
Options(opts...).
Value(&selected)
Value(selected)

err := huh.NewForm(huh.NewGroup(field)).Run()
return huh.NewForm(huh.NewGroup(field)).WithTheme(ThemeSlack())
}

// charmMultiSelectPrompt prompts the user to select multiple options using a charm huh form
func charmMultiSelectPrompt(_ *IOStreams, _ context.Context, message string, options []string) ([]string, error) {
var selected []string
err := buildMultiSelectForm(message, options, &selected).Run()
if err != nil {
return []string{}, err
}
Expand Down
Loading
Loading