fast-build-update-tool/internal/tools/pty.go (45 lines of code) (raw):

package tools import ( "io" "github.com/aymanbagabas/go-pty" ) //go:generate moq -skip-ensure -out ./moq_pty_test.go . PTY // PTY is an interface used to start and interact with a pseudo terminal type PTY interface { // Start a new PTY session with the provided command, command args, and environment Start(cmdName string, args []string, env []string) error // Run a command on the PTY session after it has been started RunCommand(cmd string) error // Wait for the session to finish Wait() error // Clean-up any resources Cleanup() // Get the reader for the PTY session Reader() io.Reader } // ptyRunner is used for running commands in a pseudo terminal environment type ptyRunner struct { pty pty.Pty cmd *pty.Cmd } func newPtyCommandRunner() (*ptyRunner, error) { p, err := pty.New() if err != nil { return nil, err } return &ptyRunner{pty: p}, nil } func (p *ptyRunner) Start(cmdName string, args []string, env []string) error { p.cmd = p.pty.Command(cmdName, args...) p.cmd.Env = env err := p.cmd.Start() if err != nil { return err } return nil } func (p *ptyRunner) RunCommand(cmd string) error { _, err := p.pty.Write([]byte(cmd)) return err } func (p *ptyRunner) Wait() error { return p.cmd.Wait() } func (p *ptyRunner) Cleanup() { p.pty.Close() } func (p *ptyRunner) Reader() io.Reader { return p.pty }