@@ -10,19 +10,18 @@ import (
1010)
1111
1212const (
13- DefaultPrompt = "»"
14- DefaultErrorMsg = "✘Invalid input! "
15- DefaultQuestionTpl = "{{ . | cyan }} "
16- DefaultPromptTpl = "{{ . | green }} "
17- DefaultInvalidTpl = "{{ . | red }} "
18- DefaultValidTpl = "{{ . | green }} "
19- DefaultErrorMsgTpl = "{{ . | red }} "
13+ DefaultPrompt = "»"
14+ DefaultErrorMsgPrefix = "✘ "
15+ DefaultQuestionTpl = "{{ . | cyan }} "
16+ DefaultPromptTpl = "{{ . | green }} "
17+ DefaultInvalidTpl = "{{ . | red }} "
18+ DefaultValidTpl = "{{ . | green }} "
19+ DefaultErrorMsgTpl = "{{ . | red }} "
2020)
2121
2222type Prompt struct {
2323 Question string
2424 Prompt string
25- ErrorMsg string
2625 PromptTpl * Tpl
2726 FuncMap template.FuncMap
2827
@@ -39,10 +38,10 @@ type Tpl struct {
3938 ValidTpl string
4039 InvalidTpl string
4140 ErrorMsgTpl string
42- CheckListener func (line []rune ) bool
41+ CheckListener func (line []rune ) error
4342}
4443
45- func NewDefaultTpl (check func (line []rune ) bool ) * Tpl {
44+ func NewDefaultTpl (check func (line []rune ) error ) * Tpl {
4645 return & Tpl {
4746 QuestionTpl : DefaultQuestionTpl ,
4847 PromptTpl : DefaultPromptTpl ,
@@ -53,10 +52,9 @@ func NewDefaultTpl(check func(line []rune) bool) *Tpl {
5352 }
5453}
5554
56- func NewDefaultPrompt (check func (line []rune ) bool , question string ) * Prompt {
55+ func NewDefaultPrompt (check func (line []rune ) error , question string ) * Prompt {
5756 return & Prompt {
5857 Question : question ,
59- ErrorMsg : DefaultErrorMsg ,
6058 Prompt : DefaultPrompt ,
6159 PromptTpl : NewDefaultTpl (check ),
6260 FuncMap : FuncMap ,
@@ -104,52 +102,36 @@ func (p *Prompt) Run() string {
104102 displayPrompt := append (render (p .prompt , p .Prompt ), render (p .question , p .Question )... )
105103 validPrompt := append (render (p .valid , p .Prompt ), render (p .question , p .Question )... )
106104 invalidPrompt := append (render (p .invalid , p .Prompt ), render (p .question , p .Question )... )
107- errorMsgPrompt := render (p .errorMsg , p .ErrorMsg )
108105
109106 l , err := readline .NewEx (& readline.Config {
110107 Prompt : string (displayPrompt ),
111108 DisableAutoSaveHistory : true ,
112109 InterruptPrompt : "^C" ,
113110 FuncFilterInputRune : filterInput ,
114111 })
112+ util .CheckAndExit (err )
115113
116114 l .Config .SetListener (func (line []rune , pos int , key rune ) (newLine []rune , newPos int , ok bool ) {
117- if p .PromptTpl .CheckListener (line ) {
115+ if err = p .PromptTpl .CheckListener (line ); err != nil {
116+ l .SetPrompt (string (invalidPrompt ))
117+ l .Refresh ()
118118
119+ } else {
119120 l .SetPrompt (string (validPrompt ))
120121 l .Refresh ()
121- } else {
122122
123- l .SetPrompt (string (invalidPrompt ))
124- l .Refresh ()
125123 }
126124 return nil , 0 , false
127125
128126 })
129- if err != nil {
130- panic (err )
131- }
132127 defer l .Close ()
133128 for {
134129 s , err := l .Readline ()
135130 util .CheckAndExit (err )
136- if p .PromptTpl .CheckListener ([]rune (s )) {
137- return s
131+ if err = p .PromptTpl .CheckListener ([]rune (s )); err != nil {
132+ fmt . Println ( string ( render ( p . errorMsg , DefaultErrorMsgPrefix + err . Error ())))
138133 } else {
139- fmt . Println ( string ( errorMsgPrompt ))
134+ return s
140135 }
141136 }
142137}
143-
144- //func Test() {
145- //
146- // check := func(line []rune) bool {
147- // if len(line) > 5 {
148- // return false
149- // }
150- // return true
151- // }
152- //
153- // p := NewDefaultPrompt(check, "请输入5个字符:")
154- // fmt.Println(p.Run())
155- //}
0 commit comments