Skip to content

Commit f3f67ad

Browse files
author
mritd
committed
feat(prompt): 尝试增加 select 功能
尝试增加 select 功能 Signed-off-by: mritd <[email protected]>
1 parent 766ce01 commit f3f67ad

File tree

2 files changed

+119
-20
lines changed

2 files changed

+119
-20
lines changed

pkg/prompt/prompt.go

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ const (
2020
)
2121

2222
type Prompt struct {
23-
Ask string
24-
Prompt string
25-
PromptTpl *Tpl
26-
FuncMap template.FuncMap
23+
Config
24+
Ask string
25+
Prompt string
26+
FuncMap template.FuncMap
2727

2828
isFirstRun bool
2929

@@ -34,7 +34,7 @@ type Prompt struct {
3434
errorMsg *template.Template
3535
}
3636

37-
type Tpl struct {
37+
type Config struct {
3838
AskTpl string
3939
PromptTpl string
4040
ValidTpl string
@@ -43,8 +43,8 @@ type Tpl struct {
4343
CheckListener func(line []rune) error
4444
}
4545

46-
func NewDefaultTpl(check func(line []rune) error) *Tpl {
47-
return &Tpl{
46+
func NewDefaultConfig(check func(line []rune) error) Config {
47+
return Config{
4848
AskTpl: DefaultAskTpl,
4949
PromptTpl: DefaultPromptTpl,
5050
InvalidTpl: DefaultInvalidTpl,
@@ -54,27 +54,27 @@ func NewDefaultTpl(check func(line []rune) error) *Tpl {
5454
}
5555
}
5656

57-
func NewDefaultPrompt(check func(line []rune) error, ask string) *Prompt {
58-
return &Prompt{
59-
Ask: ask,
60-
Prompt: DefaultPrompt,
61-
PromptTpl: NewDefaultTpl(check),
62-
FuncMap: FuncMap,
57+
func NewDefaultPrompt(check func(line []rune) error, ask string) Prompt {
58+
return Prompt{
59+
Ask: ask,
60+
Prompt: DefaultPrompt,
61+
FuncMap: FuncMap,
62+
Config: NewDefaultConfig(check),
6363
}
6464
}
6565

6666
func (p *Prompt) prepareTemplates() {
6767

6868
var err error
69-
p.ask, err = template.New("").Funcs(FuncMap).Parse(p.PromptTpl.AskTpl)
69+
p.ask, err = template.New("").Funcs(FuncMap).Parse(p.AskTpl)
7070
util.CheckAndExit(err)
71-
p.prompt, err = template.New("").Funcs(FuncMap).Parse(p.PromptTpl.PromptTpl)
71+
p.prompt, err = template.New("").Funcs(FuncMap).Parse(p.PromptTpl)
7272
util.CheckAndExit(err)
73-
p.valid, err = template.New("").Funcs(FuncMap).Parse(p.PromptTpl.ValidTpl)
73+
p.valid, err = template.New("").Funcs(FuncMap).Parse(p.ValidTpl)
7474
util.CheckAndExit(err)
75-
p.invalid, err = template.New("").Funcs(FuncMap).Parse(p.PromptTpl.InvalidTpl)
75+
p.invalid, err = template.New("").Funcs(FuncMap).Parse(p.InvalidTpl)
7676
util.CheckAndExit(err)
77-
p.errorMsg, err = template.New("").Funcs(FuncMap).Parse(p.PromptTpl.ErrorMsgTpl)
77+
p.errorMsg, err = template.New("").Funcs(FuncMap).Parse(p.ErrorMsgTpl)
7878
util.CheckAndExit(err)
7979

8080
}
@@ -121,7 +121,7 @@ func (p *Prompt) Run() string {
121121

122122
l.Config.SetListener(func(line []rune, pos int, key rune) (newLine []rune, newPos int, ok bool) {
123123
// Real-time verification
124-
if err = p.PromptTpl.CheckListener(line); err != nil {
124+
if err = p.CheckListener(line); err != nil {
125125
l.SetPrompt(string(invalidPrompt))
126126
l.Refresh()
127127
} else {
@@ -139,7 +139,7 @@ func (p *Prompt) Run() string {
139139
}
140140
s, err := l.Readline()
141141
util.CheckAndExit(err)
142-
if err = p.PromptTpl.CheckListener([]rune(s)); err != nil {
142+
if err = p.CheckListener([]rune(s)); err != nil {
143143
fmt.Print(clearLine)
144144
fmt.Println(string(render(p.errorMsg, DefaultErrorMsgPrefix+err.Error())))
145145
p.isFirstRun = false

pkg/prompt/select.go

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package prompt
2+
3+
import (
4+
"bytes"
5+
"text/template"
6+
7+
"github.com/mritd/idgen/util"
8+
)
9+
10+
const (
11+
DefaultActiveTpl = "{{ . | cyan }}"
12+
DefaultInactiveTpl = "{{ . | white }}"
13+
DefaultDetailsTpl = "{{ . | white }}"
14+
DefaultSelectHeaderTpl = `{{ "Use the arrow keys to navigate: ↓ ↑ → ←" | faint }}`
15+
DefaultSelectPromptTpl = `{{ "Select" . | faint }}:`
16+
DefaultSelectAsk = "Please select"
17+
NextLine = "\n"
18+
)
19+
20+
type Select struct {
21+
SelectConfig
22+
Items interface{}
23+
SelectPrompt string
24+
25+
selectPrompt *template.Template
26+
selectHeader *template.Template
27+
active *template.Template
28+
inactive *template.Template
29+
details *template.Template
30+
}
31+
32+
type SelectConfig struct {
33+
Prompt
34+
SelectHeaderTpl string
35+
SelectPromptTpl string
36+
ActiveTpl string
37+
InactiveTpl string
38+
DetailsTpl string
39+
}
40+
41+
func NewDefaultSelectConfig(check func(line []rune) error, selectAsk string) SelectConfig {
42+
return SelectConfig{
43+
Prompt: NewDefaultPrompt(check, selectAsk),
44+
SelectHeaderTpl: DefaultSelectHeaderTpl,
45+
SelectPromptTpl: DefaultSelectPromptTpl,
46+
ActiveTpl: DefaultActiveTpl,
47+
InactiveTpl: DefaultInactiveTpl,
48+
DetailsTpl: DefaultDetailsTpl,
49+
}
50+
}
51+
52+
func NewDefaultSelect(check func(line []rune) error, items interface{}) *Select {
53+
return &Select{
54+
SelectConfig: NewDefaultSelectConfig(check, DefaultSelectAsk),
55+
Items: items,
56+
}
57+
}
58+
59+
func (s *Select) prepareTemplates() {
60+
61+
var err error
62+
63+
// Prompt prepare
64+
s.ask, err = template.New("").Funcs(FuncMap).Parse(s.AskTpl)
65+
util.CheckAndExit(err)
66+
s.prompt, err = template.New("").Funcs(FuncMap).Parse(s.PromptTpl)
67+
util.CheckAndExit(err)
68+
s.valid, err = template.New("").Funcs(FuncMap).Parse(s.ValidTpl)
69+
util.CheckAndExit(err)
70+
s.invalid, err = template.New("").Funcs(FuncMap).Parse(s.InvalidTpl)
71+
util.CheckAndExit(err)
72+
s.errorMsg, err = template.New("").Funcs(FuncMap).Parse(s.ErrorMsgTpl)
73+
util.CheckAndExit(err)
74+
75+
// Select prepare
76+
s.selectHeader, err = template.New("").Funcs(FuncMap).Parse(s.SelectHeaderTpl)
77+
util.CheckAndExit(err)
78+
s.selectPrompt, err = template.New("").Funcs(FuncMap).Parse(s.SelectPromptTpl)
79+
util.CheckAndExit(err)
80+
s.active, err = template.New("").Funcs(FuncMap).Parse(s.ActiveTpl)
81+
util.CheckAndExit(err)
82+
s.inactive, err = template.New("").Funcs(FuncMap).Parse(s.InactiveTpl)
83+
util.CheckAndExit(err)
84+
s.details, err = template.New("").Funcs(FuncMap).Parse(s.DetailsTpl)
85+
util.CheckAndExit(err)
86+
87+
}
88+
89+
func (s *Select) prepareDisplayData(sindex int) {
90+
var data bytes.Buffer
91+
92+
// select header
93+
data.Write(render(s.selectHeader, NextLine))
94+
// select prompt
95+
data.Write(render(s.selectPrompt, s.SelectPrompt+NextLine))
96+
//for it := range s.Items {
97+
//
98+
//}
99+
}

0 commit comments

Comments
 (0)