...
1
2
3 package prompt
4
5 import (
6 "syscall"
7
8 "github.com/c-bata/go-prompt/internal/term"
9 "golang.org/x/sys/unix"
10 )
11
12 const maxReadBytes = 1024
13
14
15 type PosixParser struct {
16 fd int
17 origTermios syscall.Termios
18 }
19
20
21 func (t *PosixParser) Setup() error {
22
23 if err := syscall.SetNonblock(t.fd, true); err != nil {
24 return err
25 }
26 if err := term.SetRaw(t.fd); err != nil {
27 return err
28 }
29 return nil
30 }
31
32
33 func (t *PosixParser) TearDown() error {
34 if err := syscall.SetNonblock(t.fd, false); err != nil {
35 return err
36 }
37 if err := term.Restore(); err != nil {
38 return err
39 }
40 return nil
41 }
42
43
44 func (t *PosixParser) Read() ([]byte, error) {
45 buf := make([]byte, maxReadBytes)
46 n, err := syscall.Read(t.fd, buf)
47 if err != nil {
48 return []byte{}, err
49 }
50 return buf[:n], nil
51 }
52
53
54 func (t *PosixParser) GetWinSize() *WinSize {
55 ws, err := unix.IoctlGetWinsize(t.fd, unix.TIOCGWINSZ)
56 if err != nil {
57 panic(err)
58 }
59 return &WinSize{
60 Row: ws.Row,
61 Col: ws.Col,
62 }
63 }
64
65 var _ ConsoleParser = &PosixParser{}
66
67
68 func NewStandardInputParser() *PosixParser {
69 in, err := syscall.Open("/dev/tty", syscall.O_RDONLY, 0)
70 if err != nil {
71 panic(err)
72 }
73
74 return &PosixParser{
75 fd: in,
76 }
77 }
78
View as plain text