2017-08-16 03:22:38 +00:00
|
|
|
// +build !windows
|
|
|
|
|
2017-07-06 16:00:35 +00:00
|
|
|
package prompt
|
|
|
|
|
|
|
|
import (
|
2018-10-17 16:58:55 +00:00
|
|
|
"log"
|
2017-07-06 16:00:35 +00:00
|
|
|
"syscall"
|
|
|
|
)
|
|
|
|
|
2018-10-17 16:58:55 +00:00
|
|
|
const flushMaxRetryCount = 3
|
|
|
|
|
2018-02-14 03:40:33 +00:00
|
|
|
// PosixWriter is a ConsoleWriter implementation for POSIX environment.
|
|
|
|
// To control terminal emulator, this outputs VT100 escape sequences.
|
2018-02-12 10:12:31 +00:00
|
|
|
type PosixWriter struct {
|
2018-06-20 16:31:29 +00:00
|
|
|
VT100Writer
|
|
|
|
fd int
|
2017-07-06 16:00:35 +00:00
|
|
|
}
|
|
|
|
|
2018-02-14 03:40:33 +00:00
|
|
|
// Flush to flush buffer
|
2018-02-12 10:12:31 +00:00
|
|
|
func (w *PosixWriter) Flush() error {
|
2018-10-16 10:11:54 +00:00
|
|
|
l := len(w.buffer)
|
|
|
|
offset := 0
|
2018-10-17 16:58:55 +00:00
|
|
|
retry := 0
|
2018-10-16 10:11:54 +00:00
|
|
|
for {
|
|
|
|
n, err := syscall.Write(w.fd, w.buffer[offset:])
|
|
|
|
if err != nil {
|
2018-10-17 16:58:55 +00:00
|
|
|
log.Printf("[DEBUG] flush error: %s", err)
|
|
|
|
if retry < flushMaxRetryCount {
|
|
|
|
retry++
|
|
|
|
continue
|
|
|
|
}
|
2018-10-16 10:11:54 +00:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
offset += n
|
|
|
|
if offset == l {
|
|
|
|
break
|
|
|
|
}
|
2017-07-06 16:00:35 +00:00
|
|
|
}
|
|
|
|
w.buffer = []byte{}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2018-02-12 10:12:31 +00:00
|
|
|
var _ ConsoleWriter = &PosixWriter{}
|
2017-07-16 18:53:23 +00:00
|
|
|
|
2018-02-14 03:40:33 +00:00
|
|
|
// NewStandardOutputWriter returns ConsoleWriter object to write to stdout.
|
2018-06-20 16:31:29 +00:00
|
|
|
// This generates VT100 escape sequences because almost terminal emulators
|
|
|
|
// in POSIX OS built on top of a VT100 specification.
|
2018-10-20 04:06:36 +00:00
|
|
|
func NewStandardOutputWriter() ConsoleWriter {
|
2018-02-12 10:12:31 +00:00
|
|
|
return &PosixWriter{
|
2017-07-16 18:53:23 +00:00
|
|
|
fd: syscall.Stdout,
|
|
|
|
}
|
|
|
|
}
|