forked from ssdb/gossdb
-
Notifications
You must be signed in to change notification settings - Fork 1
/
term.go
76 lines (68 loc) · 1.54 KB
/
term.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package term
import (
"bytes"
"encoding/csv"
"fmt"
"io"
"log"
"os"
"strings"
"time"
prompt "github.com/c-bata/go-prompt"
)
type CmdFunc func(cmd ...string) (string, error)
// Terminal Is a terminal renderer.
type Terminal struct {
Reader io.Reader
Writer io.Writer
Prompt string
CmdFunc CmdFunc
}
// NewTerminal Create a new Terminal.
func NewTerminal(prompt string, cmd CmdFunc) *Terminal {
return &Terminal{
Reader: os.Stdin,
Writer: os.Stdout,
Prompt: prompt,
CmdFunc: cmd,
}
}
func completer(d prompt.Document) []prompt.Suggest {
if d.FindStartOfPreviousWord() == 0 {
return prompt.FilterHasPrefix(command, d.GetWordBeforeCursorWithSpace(), true)
}
return []prompt.Suggest{}
}
// Run Is run the terminal.
func (c *Terminal) Run() error {
logger := log.New(c.Writer, "", log.LstdFlags)
pro := prompt.New(func(string) {}, completer,
prompt.OptionPrefix(c.Prompt),
prompt.OptionPrefixTextColor(prompt.DefaultColor),
prompt.OptionPrefixBackgroundColor(prompt.DefaultColor),
)
for {
line := pro.Input()
read := csv.NewReader(bytes.NewBufferString(strings.TrimSpace(line)))
read.Comma = ' '
read.LazyQuotes = true
read.TrimLeadingSpace = true
da, err := read.ReadAll()
if err != nil {
logger.Println(err)
continue
}
for _, v := range da {
beg := time.Now()
result, err := c.CmdFunc(v...)
if err != nil {
logger.Println(err)
continue
}
sub := time.Since(beg).Truncate(time.Millisecond)
fmt.Fprintln(c.Writer, result)
fmt.Fprintf(c.Writer, "(%s)\n", sub)
}
}
return nil
}