From 7860198dd7ffdc35e1afe263d65fd659fca71fbb Mon Sep 17 00:00:00 2001 From: Nate Smith Date: Wed, 16 Aug 2023 22:45:06 -0500 Subject: [PATCH] use prompter in shared editable code --- pkg/cmd/issue/edit/edit.go | 10 +-- pkg/cmd/issue/edit/edit_test.go | 4 +- pkg/cmd/pr/edit/edit.go | 12 ++-- pkg/cmd/pr/shared/editable.go | 109 ++++++++++++-------------------- 4 files changed, 57 insertions(+), 78 deletions(-) diff --git a/pkg/cmd/issue/edit/edit.go b/pkg/cmd/issue/edit/edit.go index 2fe4c62b7..53400fb63 100644 --- a/pkg/cmd/issue/edit/edit.go +++ b/pkg/cmd/issue/edit/edit.go @@ -21,10 +21,11 @@ type EditOptions struct { HttpClient func() (*http.Client, error) IO *iostreams.IOStreams BaseRepo func() (ghrepo.Interface, error) + Prompter prShared.EditPrompter DetermineEditor func() (string, error) - FieldsToEditSurvey func(*prShared.Editable) error - EditFieldsSurvey func(*prShared.Editable, string) error + FieldsToEditSurvey func(prShared.EditPrompter, *prShared.Editable) error + EditFieldsSurvey func(prShared.EditPrompter, *prShared.Editable, string) error FetchOptions func(*api.Client, ghrepo.Interface, *prShared.Editable) error SelectorArgs []string @@ -41,6 +42,7 @@ func NewCmdEdit(f *cmdutil.Factory, runF func(*EditOptions) error) *cobra.Comman FieldsToEditSurvey: prShared.FieldsToEditSurvey, EditFieldsSurvey: prShared.EditFieldsSurvey, FetchOptions: prShared.FetchOptions, + Prompter: f.Prompter, } var bodyFile string @@ -152,7 +154,7 @@ func editRun(opts *EditOptions) error { // Prompt the user which fields they'd like to edit. editable := opts.Editable if opts.Interactive { - err = opts.FieldsToEditSurvey(&editable) + err = opts.FieldsToEditSurvey(opts.Prompter, &editable) if err != nil { return err } @@ -222,7 +224,7 @@ func editRun(opts *EditOptions) error { if err != nil { return err } - err = opts.EditFieldsSurvey(&editable, editorCommand) + err = opts.EditFieldsSurvey(opts.Prompter, &editable, editorCommand) if err != nil { return err } diff --git a/pkg/cmd/issue/edit/edit_test.go b/pkg/cmd/issue/edit/edit_test.go index d73132f35..db0b09d2d 100644 --- a/pkg/cmd/issue/edit/edit_test.go +++ b/pkg/cmd/issue/edit/edit_test.go @@ -511,7 +511,7 @@ func Test_editRun(t *testing.T) { input: &EditOptions{ SelectorArgs: []string{"123"}, Interactive: true, - FieldsToEditSurvey: func(eo *prShared.Editable) error { + FieldsToEditSurvey: func(p prShared.EditPrompter, eo *prShared.Editable) error { eo.Title.Edited = true eo.Body.Edited = true eo.Assignees.Edited = true @@ -520,7 +520,7 @@ func Test_editRun(t *testing.T) { eo.Milestone.Edited = true return nil }, - EditFieldsSurvey: func(eo *prShared.Editable, _ string) error { + EditFieldsSurvey: func(p prShared.EditPrompter, eo *prShared.Editable, _ string) error { eo.Title.Value = "new title" eo.Body.Value = "new body" eo.Assignees.Value = []string{"monalisa", "hubot"} diff --git a/pkg/cmd/pr/edit/edit.go b/pkg/cmd/pr/edit/edit.go index bab7a26d4..c606ae6bb 100644 --- a/pkg/cmd/pr/edit/edit.go +++ b/pkg/cmd/pr/edit/edit.go @@ -24,6 +24,7 @@ type EditOptions struct { Surveyor Surveyor Fetcher EditableOptionsFetcher EditorRetriever EditorRetriever + Prompter shared.EditPrompter SelectorArg string Interactive bool @@ -35,9 +36,10 @@ func NewCmdEdit(f *cmdutil.Factory, runF func(*EditOptions) error) *cobra.Comman opts := &EditOptions{ IO: f.IOStreams, HttpClient: f.HttpClient, - Surveyor: surveyor{}, + Surveyor: surveyor{P: f.Prompter}, Fetcher: fetcher{}, EditorRetriever: editorRetriever{config: f.Config}, + Prompter: f.Prompter, } var bodyFile string @@ -280,14 +282,16 @@ type Surveyor interface { EditFields(*shared.Editable, string) error } -type surveyor struct{} +type surveyor struct { + P shared.EditPrompter +} func (s surveyor) FieldsToEdit(editable *shared.Editable) error { - return shared.FieldsToEditSurvey(editable) + return shared.FieldsToEditSurvey(s.P, editable) } func (s surveyor) EditFields(editable *shared.Editable, editorCmd string) error { - return shared.EditFieldsSurvey(editable, editorCmd) + return shared.EditFieldsSurvey(s.P, editable, editorCmd) } type EditableOptionsFetcher interface { diff --git a/pkg/cmd/pr/shared/editable.go b/pkg/cmd/pr/shared/editable.go index 0fbe689fc..decd6456c 100644 --- a/pkg/cmd/pr/shared/editable.go +++ b/pkg/cmd/pr/shared/editable.go @@ -4,12 +4,9 @@ import ( "fmt" "strings" - "github.com/AlecAivazis/survey/v2" "github.com/cli/cli/v2/api" "github.com/cli/cli/v2/internal/ghrepo" - "github.com/cli/cli/v2/internal/prompter" "github.com/cli/cli/v2/pkg/set" - "github.com/cli/cli/v2/pkg/surveyext" ) type Editable struct { @@ -255,34 +252,42 @@ func (ep *EditableProjects) clone() EditableProjects { } } -func EditFieldsSurvey(editable *Editable, editorCommand string) error { +type EditPrompter interface { + Select(string, string, []string) (int, error) + Input(string, string) (string, error) + MarkdownEditor(string, string, bool) (string, error) + MultiSelect(string, []string, []string) ([]int, error) + Confirm(string, bool) (bool, error) +} + +func EditFieldsSurvey(p EditPrompter, editable *Editable, editorCommand string) error { var err error if editable.Title.Edited { - editable.Title.Value, err = titleSurvey(editable.Title.Default) + editable.Title.Value, err = p.Input("Title", editable.Title.Default) if err != nil { return err } } if editable.Body.Edited { - editable.Body.Value, err = bodySurvey(editable.Body.Default, editorCommand) + editable.Body.Value, err = p.MarkdownEditor("Body", editable.Body.Default, false) if err != nil { return err } } if editable.Reviewers.Edited { - editable.Reviewers.Value, err = multiSelectSurvey("Reviewers", editable.Reviewers.Default, editable.Reviewers.Options) - if err != nil { - return err - } + editable.Reviewers.Value, err = multiSelectSurvey( + p, "Reviewers", editable.Reviewers.Default, editable.Reviewers.Options) } if editable.Assignees.Edited { - editable.Assignees.Value, err = multiSelectSurvey("Assignees", editable.Assignees.Default, editable.Assignees.Options) + editable.Assignees.Value, err = multiSelectSurvey( + p, "Assignees", editable.Assignees.Default, editable.Assignees.Options) if err != nil { return err } } if editable.Labels.Edited { - editable.Labels.Add, err = multiSelectSurvey("Labels", editable.Labels.Default, editable.Labels.Options) + editable.Labels.Add, err = multiSelectSurvey( + p, "Labels", editable.Labels.Default, editable.Labels.Options) if err != nil { return err } @@ -300,18 +305,19 @@ func EditFieldsSurvey(editable *Editable, editorCommand string) error { } } if editable.Projects.Edited { - editable.Projects.Value, err = multiSelectSurvey("Projects", editable.Projects.Default, editable.Projects.Options) + editable.Projects.Value, err = multiSelectSurvey( + p, "Projects", editable.Projects.Default, editable.Projects.Options) if err != nil { return err } } if editable.Milestone.Edited { - editable.Milestone.Value, err = milestoneSurvey(editable.Milestone.Default, editable.Milestone.Options) + editable.Milestone.Value, err = milestoneSurvey(p, editable.Milestone.Default, editable.Milestone.Options) if err != nil { return err } } - confirm, err := confirmSurvey() + confirm, err := p.Confirm("Submit?", true) if err != nil { return err } @@ -322,7 +328,7 @@ func EditFieldsSurvey(editable *Editable, editorCommand string) error { return nil } -func FieldsToEditSurvey(editable *Editable) error { +func FieldsToEditSurvey(p EditPrompter, editable *Editable) error { contains := func(s []string, str string) bool { for _, v := range s { if v == str { @@ -337,7 +343,7 @@ func FieldsToEditSurvey(editable *Editable) error { opts = append(opts, "Reviewers") } opts = append(opts, "Assignees", "Labels", "Projects", "Milestone") - results, err := multiSelectSurvey("What would you like to edit?", []string{}, opts) + results, err := multiSelectSurvey(p, "What would you like to edit?", []string{}, opts) if err != nil { return err } @@ -414,67 +420,34 @@ func FetchOptions(client *api.Client, repo ghrepo.Interface, editable *Editable) return nil } -func titleSurvey(title string) (string, error) { - var result string - q := &survey.Input{ - Message: "Title", - Default: title, - } - err := survey.AskOne(q, &result) - return result, err -} - -func bodySurvey(body, editorCommand string) (string, error) { - var result string - q := &surveyext.GhEditor{ - EditorCommand: editorCommand, - Editor: &survey.Editor{ - Message: "Body", - FileName: "*.md", - Default: body, - HideDefault: true, - AppendDefault: true, - }, - } - err := survey.AskOne(q, &result) - return result, err -} - -func multiSelectSurvey(message string, defaults, options []string) ([]string, error) { +func multiSelectSurvey(p EditPrompter, message string, defaults, options []string) (results []string, err error) { if len(options) == 0 { return nil, nil } - var results []string - q := &survey.MultiSelect{ - Message: message, - Options: options, - Default: defaults, - Filter: prompter.LatinMatchingFilter, + + var selected []int + selected, err = p.MultiSelect(message, defaults, options) + if err != nil { + return } - err := survey.AskOne(q, &results) + + for _, i := range selected { + results = append(results, options[i]) + } + return results, err } -func milestoneSurvey(title string, opts []string) (string, error) { +func milestoneSurvey(p EditPrompter, title string, opts []string) (result string, err error) { if len(opts) == 0 { return "", nil } - var result string - q := &survey.Select{ - Message: "Milestone", - Options: opts, - Default: title, + var selected int + selected, err = p.Select("Milestone", title, opts) + if err != nil { + return } - err := survey.AskOne(q, &result) - return result, err -} -func confirmSurvey() (bool, error) { - var result bool - q := &survey.Confirm{ - Message: "Submit?", - Default: true, - } - err := survey.AskOne(q, &result) - return result, err + result = opts[selected] + return }