go-prompt/output_posix.go

68 lines
1.5 KiB
Go
Raw Normal View History

2017-08-16 03:22:38 +00:00
// +build !windows
2017-07-06 16:00:35 +00:00
package prompt
import (
"syscall"
)
2018-10-17 16:58:55 +00:00
const flushMaxRetryCount = 3
// 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
}
// 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
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
var (
// NewStandardOutputWriter returns ConsoleWriter object to write to stdout.
// This generates VT100 escape sequences because almost terminal emulators
// in POSIX OS built on top of a VT100 specification.
// Deprecated: Please use NewStdoutWriter
NewStandardOutputWriter = NewStdoutWriter
)
// NewStdoutWriter 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.
func NewStdoutWriter() ConsoleWriter {
2018-02-12 10:12:31 +00:00
return &PosixWriter{
2017-07-16 18:53:23 +00:00
fd: syscall.Stdout,
}
}
// NewStderrWriter returns ConsoleWriter object to write to stderr.
// This generates VT100 escape sequences because almost terminal emulators
// in POSIX OS built on top of a VT100 specification.
func NewStderrWriter() ConsoleWriter {
return &PosixWriter{
fd: syscall.Stderr,
}
}