...
1
2
3
4
5
6
7
8
9
10
11
12
13
14 package ui
15
16 import (
17 "bufio"
18 "context"
19 "errors"
20 "fmt"
21 "io"
22 "strings"
23 )
24
25 type ErrPromptDeclined struct{}
26
27 func (e *ErrPromptDeclined) Error() string {
28 return "user declined the prompt"
29 }
30
31 type ErrInvalidInput struct {
32 Got string
33 Allowed string
34 }
35
36 func (e *ErrInvalidInput) Error() string {
37 return fmt.Sprintf("invalid input %#v (allowed values %v)", e.Got, e.Allowed)
38 }
39
40 func newInvalidYesOrNoInput(got string) error {
41 return &ErrInvalidInput{Got: got, Allowed: "y, n"}
42 }
43
44 func (w *Env) prompt() error {
45 fmt.Fprint(w.Stderr, "Are you sure you would like to continue? [y/N] ")
46
47
48 r, err := bufio.NewReader(w.Stdin).ReadString('\n')
49 if err != nil && !errors.Is(err, io.EOF) {
50 return err
51 }
52
53 value := strings.Trim(r, "\r\n")
54 switch strings.ToLower(value) {
55 case "y":
56 return nil
57 case "":
58 fallthrough
59 case "n":
60 return &ErrPromptDeclined{}
61 default:
62
63 return newInvalidYesOrNoInput(value)
64 }
65 }
66
67
68
69
70
71
72 func ConfirmContinue(ctx context.Context) error {
73 return getEnv(ctx).prompt()
74 }
75
View as plain text