From 86201baa1bf72f9717fc4643cd0a00554a23bd72 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sat, 19 May 2018 01:38:13 -0400 Subject: eh --- go/src/lib/pipeline/cmd.go | 16 ++++++++ go/src/lib/pipeline/pipeline.go | 80 ++++++++++++++++++++++++++++++++++++ go/src/lib/statusline/statuslinue.go | 24 +++++++++++ 3 files changed, 120 insertions(+) create mode 100644 go/src/lib/pipeline/cmd.go create mode 100644 go/src/lib/pipeline/pipeline.go create mode 100644 go/src/lib/statusline/statuslinue.go (limited to 'go/src/lib') diff --git a/go/src/lib/pipeline/cmd.go b/go/src/lib/pipeline/cmd.go new file mode 100644 index 0000000..563becf --- /dev/null +++ b/go/src/lib/pipeline/cmd.go @@ -0,0 +1,16 @@ +package pipeline + +import ( + "io" +) + +type Cmd interface { + CombinedOutput() ([]byte, error) + Output() ([]byte, error) + Run() error + Start() error + StderrPipe() (io.ReadCloser, error) + StdinPipe() (io.WriteCloser, error) + StdoutPipe() (io.ReadCloser, error) + Wait() error +} diff --git a/go/src/lib/pipeline/pipeline.go b/go/src/lib/pipeline/pipeline.go new file mode 100644 index 0000000..a74e626 --- /dev/null +++ b/go/src/lib/pipeline/pipeline.go @@ -0,0 +1,80 @@ +package pipeline + +import ( + "os/exec" + "io" +) + +type Pipe struct { + Cmds []exec.Cmd +} + +func (pl *Pipe) preStart() error { + for _, cmd := range pl.Cmds[:len(pl.Cmds)-2] { + if err := cmd.Start(); err != nil { + return err + } + } + return nil +} + +func (pl *Pipe) Start() error { + for _, cmd := range pl.Cmds { + if err := cmd.Start(); err != nil { + return err + } + } + return nil +} + +func (pl *Pipe) Wait() error { + for _, cmd := range pl.Cmds { + if err := cmd.Wait(); err != nil { + return err + } + } + return nil +} + +func (pl *Pipe) Run() error { + if err := pl.Start(); err != nil { + return err + } + return pl.Wait() +} + +func (pl *Pipe) CombinedOutput() ([]byte, error) { + if err := pl.preStart(); err != nil { + return nil, err + } + return pl.Cmds[len(pl.Cmds)-1].CombinedOutput() +} + +func (pl *Pipe) Output() ([]byte, error) { + if err := pl.preStart(); err != nil { + return nil, err + } + return pl.Cmds[len(pl.Cmds)-1].Output() +} + +func (pl *Pipe) StdinPipe() (io.WriteCloser, error) { + return pl.Cmds[0].StdinPipe() +} + +func (pl *Pipe) StdoutPipe() (io.ReadCloser, error) { + return pl.Cmds[len(pl.Cmds)-1].StdoutPipe() +} + +var _ = &Pipe{} + +func Pipeline(cmds ...exec.Cmd) (*Pipe, error) { + pl := &Pipe{cmds} + for i := range pl.Cmds[:len(pl.Cmds)-2] { + out, err := pl.Cmds[i].StdoutPipe() + if err != nil { + return nil, err + } + pl.Cmds[i+1].Stdin = out + } + return pl, nil +} diff --git a/go/src/lib/statusline/statuslinue.go b/go/src/lib/statusline/statuslinue.go new file mode 100644 index 0000000..90ec1af --- /dev/null +++ b/go/src/lib/statusline/statuslinue.go @@ -0,0 +1,24 @@ +package statusline + +import ( + "fmt" + "io" +) + +type StatusLine struct { + out io.Writer + prevLen int +} + +func NewStatusLine(out io.Writer) *StatusLine { + return &StatusLine{out: out} +} + +func (sl *StatusLine) Put(line string) { + fmt.Fprintf(sl.out, "\r%-[1]*[2]s", sl.prevLen, line) + sl.prevLen = len(line) +} + +func (sl *StatusLine) End() { + fmt.Fprintf(sl.out, "\r%-[1]*[2]s\r", sl.prevLen, "") +} -- cgit v1.2.3-2-g168b