22package cli
33
44import (
5+ "context"
56 "fmt"
67 "io"
78 "os"
9+ "os/signal"
810 "path"
911 "path/filepath"
1012 "strings"
@@ -15,7 +17,7 @@ import (
1517 "github.com/spf13/cobra"
1618)
1719
18- // should be inject during the build process
20+ // should be injected during the build process
1921var version string
2022
2123// NewRootCommand returns the instance of cobra.Command
@@ -35,39 +37,42 @@ func NewRootCommand(execer exec.Execer, out io.Writer) (cmd *cobra.Command) {
3537 flags .BoolVarP (& opt .loop , "loop" , "" , true , "Run the Markdown in loop mode." )
3638 flags .BoolVarP (& opt .keepFilter , "keep-filter" , "" , true , "Indicate if keep the filter." )
3739 flags .BoolVarP (& opt .keepScripts , "keep-scripts" , "" , false , "Indicate if keep the temporary scripts." )
40+ flags .IntVarP (& opt .pageSize , "page-size" , "" , 6 , "Number of the select items." )
3841 return
3942}
4043
4144func (o * option ) runE (cmd * cobra.Command , args []string ) (err error ) {
42- scriptRunners := NewScriptRunners ()
43-
44- for _ , mdFilePath := range args {
45- var files []string
46- if files , err = filepath .Glob (mdFilePath ); err != nil {
47- return
48- }
49-
50- for _ , file := range files {
51- if ! strings .HasSuffix (file , ".md" ) {
52- continue
45+ var scriptRunners ScriptRunners
46+ if scriptRunners , err = o .parseMarkdownRunners (args ); err == nil && scriptRunners .Size () > 1 {
47+ for {
48+ if err = o .executeScripts (scriptRunners ); err != nil {
49+ _ , _ = fmt .Fprintln (cmd .ErrOrStderr (), err .Error ())
5350 }
54- var runners ScriptRunners
55- if runners , err = o . parseMarkdownRunner ( file ); err != nil {
51+
52+ if ! o . loop {
5653 break
5754 }
58-
59- scriptRunners = append (scriptRunners , runners ... )
6055 }
6156 }
57+ return
58+ }
6259
63- if scriptRunners .Size () > 1 {
64- for {
65- if err = o .executeScripts (scriptRunners ); err != nil {
66- fmt .Fprintln (cmd .ErrOrStderr (), err .Error ())
67- }
60+ func (o * option ) parseMarkdownRunners (files []string ) (scriptRunners ScriptRunners , err error ) {
61+ scriptRunners = NewScriptRunners ()
6862
69- if ! o .loop {
70- break
63+ for _ , mdFilePath := range files {
64+ var files []string
65+ if files , err = filepath .Glob (mdFilePath ); err == nil {
66+ for _ , file := range files {
67+ if ! strings .HasSuffix (file , ".md" ) {
68+ continue
69+ }
70+ var runners ScriptRunners
71+ if runners , err = o .parseMarkdownRunner (file ); err != nil {
72+ break
73+ }
74+
75+ scriptRunners = append (scriptRunners , runners ... )
7176 }
7277 }
7378 }
@@ -147,17 +152,23 @@ type option struct {
147152 loop bool
148153 keepFilter bool
149154 keepScripts bool
155+ pageSize int
150156
151157 execer exec.Execer
152158}
153159
154160func (o * option ) executeScripts (scriptRunners ScriptRunners ) (err error ) {
161+ c := make (chan os.Signal )
162+ signal .Notify (c , os .Interrupt )
163+
155164 selector := & survey.MultiSelect {
156165 Message : "Choose the code block to run" ,
157166 Options : scriptRunners .GetTitles (),
158167 }
159168 var titles []string
160- if err = survey .AskOne (selector , & titles , survey .WithKeepFilter (o .keepFilter )); err != nil {
169+ if err = survey .AskOne (selector , & titles ,
170+ survey .WithKeepFilter (o .keepFilter ),
171+ survey .WithPageSize (o .pageSize )); err != nil {
161172 return
162173 }
163174
@@ -167,9 +178,15 @@ func (o *option) executeScripts(scriptRunners ScriptRunners) (err error) {
167178 break
168179 }
169180
181+ ctx , cancel := context .WithCancel (context .Background ())
182+ go func () {
183+ <- c
184+ cancel ()
185+ }()
186+
170187 if runner := scriptRunners .GetRunner (title ); runner == nil {
171188 fmt .Println ("cannot found runner:" , title )
172- } else if err = runner .Run (); err != nil {
189+ } else if err = runner .Run (ctx ); err != nil {
173190 break
174191 }
175192 }
0 commit comments