output_posix.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. // +build !windows
  2. package prompt
  3. import (
  4. "syscall"
  5. )
  6. const flushMaxRetryCount = 3
  7. // PosixWriter is a ConsoleWriter implementation for POSIX environment.
  8. // To control terminal emulator, this outputs VT100 escape sequences.
  9. type PosixWriter struct {
  10. VT100Writer
  11. fd int
  12. }
  13. // Flush to flush buffer
  14. func (w *PosixWriter) Flush() error {
  15. l := len(w.buffer)
  16. offset := 0
  17. retry := 0
  18. for {
  19. n, err := syscall.Write(w.fd, w.buffer[offset:])
  20. if err != nil {
  21. if retry < flushMaxRetryCount {
  22. retry++
  23. continue
  24. }
  25. return err
  26. }
  27. offset += n
  28. if offset == l {
  29. break
  30. }
  31. }
  32. w.buffer = []byte{}
  33. return nil
  34. }
  35. var _ ConsoleWriter = &PosixWriter{}
  36. var (
  37. // NewStandardOutputWriter returns ConsoleWriter object to write to stdout.
  38. // This generates VT100 escape sequences because almost terminal emulators
  39. // in POSIX OS built on top of a VT100 specification.
  40. // Deprecated: Please use NewStdoutWriter
  41. NewStandardOutputWriter = NewStdoutWriter
  42. )
  43. // NewStdoutWriter returns ConsoleWriter object to write to stdout.
  44. // This generates VT100 escape sequences because almost terminal emulators
  45. // in POSIX OS built on top of a VT100 specification.
  46. func NewStdoutWriter() ConsoleWriter {
  47. return &PosixWriter{
  48. fd: syscall.Stdout,
  49. }
  50. }
  51. // NewStderrWriter returns ConsoleWriter object to write to stderr.
  52. // This generates VT100 escape sequences because almost terminal emulators
  53. // in POSIX OS built on top of a VT100 specification.
  54. func NewStderrWriter() ConsoleWriter {
  55. return &PosixWriter{
  56. fd: syscall.Stderr,
  57. }
  58. }