...
1
2
3 package prompt
4
5 import (
6 "syscall"
7 )
8
9 const flushMaxRetryCount = 3
10
11
12
13 type PosixWriter struct {
14 VT100Writer
15 fd int
16 }
17
18
19 func (w *PosixWriter) Flush() error {
20 l := len(w.buffer)
21 offset := 0
22 retry := 0
23 for {
24 n, err := syscall.Write(w.fd, w.buffer[offset:])
25 if err != nil {
26 if retry < flushMaxRetryCount {
27 retry++
28 continue
29 }
30 return err
31 }
32 offset += n
33 if offset == l {
34 break
35 }
36 }
37 w.buffer = []byte{}
38 return nil
39 }
40
41 var _ ConsoleWriter = &PosixWriter{}
42
43 var (
44
45
46
47
48 NewStandardOutputWriter = NewStdoutWriter
49 )
50
51
52
53
54 func NewStdoutWriter() ConsoleWriter {
55 return &PosixWriter{
56 fd: syscall.Stdout,
57 }
58 }
59
60
61
62
63 func NewStderrWriter() ConsoleWriter {
64 return &PosixWriter{
65 fd: syscall.Stderr,
66 }
67 }
68
View as plain text