104 lines
1.9 KiB
Go
104 lines
1.9 KiB
Go
package command
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/AlecAivazis/survey/v2"
|
|
"github.com/pkg/errors"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
type titleBody struct {
|
|
Body string
|
|
Title string
|
|
}
|
|
|
|
const (
|
|
_confirmed = iota
|
|
_unconfirmed = iota
|
|
_cancel = iota
|
|
)
|
|
|
|
func confirm() (int, error) {
|
|
confirmAnswers := struct {
|
|
Confirmation int
|
|
}{}
|
|
confirmQs := []*survey.Question{
|
|
{
|
|
Name: "confirmation",
|
|
Prompt: &survey.Select{
|
|
Message: "Submit?",
|
|
Options: []string{
|
|
"Yes",
|
|
"Edit",
|
|
"Cancel",
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
err := survey.Ask(confirmQs, &confirmAnswers)
|
|
if err != nil {
|
|
return -1, errors.Wrap(err, "could not prompt")
|
|
}
|
|
|
|
return confirmAnswers.Confirmation, nil
|
|
}
|
|
|
|
func titleBodySurvey(cmd *cobra.Command, providedTitle string, providedBody string) (*titleBody, error) {
|
|
inProgress := titleBody{}
|
|
|
|
confirmed := false
|
|
editor := determineEditor()
|
|
|
|
for !confirmed {
|
|
titleQuestion := &survey.Question{
|
|
Name: "title",
|
|
Prompt: &survey.Input{
|
|
Message: "Title",
|
|
Default: inProgress.Title,
|
|
},
|
|
}
|
|
bodyQuestion := &survey.Question{
|
|
Name: "body",
|
|
Prompt: &survey.Editor{
|
|
Message: fmt.Sprintf("Body (%s)", editor),
|
|
FileName: "*.md",
|
|
Default: inProgress.Body,
|
|
AppendDefault: true,
|
|
Editor: editor,
|
|
},
|
|
}
|
|
|
|
qs := []*survey.Question{}
|
|
if providedTitle == "" {
|
|
qs = append(qs, titleQuestion)
|
|
}
|
|
if providedBody == "" {
|
|
qs = append(qs, bodyQuestion)
|
|
}
|
|
|
|
err := survey.Ask(qs, &inProgress)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "could not prompt")
|
|
}
|
|
|
|
confirmA, err := confirm()
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "unable to confirm")
|
|
}
|
|
switch confirmA {
|
|
case _confirmed:
|
|
confirmed = true
|
|
case _unconfirmed:
|
|
continue
|
|
case _cancel:
|
|
cmd.Println("Discarding.")
|
|
return nil, nil
|
|
default:
|
|
panic("reached unreachable case")
|
|
}
|
|
|
|
}
|
|
|
|
return &inProgress, nil
|
|
}
|