| type functionHandle struct { |
| stdin, stderr, stdout pipe |
| bufferedStdout *bufio.Reader |
| func newFunctionHandle(main Main) command { |
| return &functionHandle{main: main} |
| func (fh *functionHandle) Stdout() *bufio.Reader { |
| func (fh *functionHandle) Stderr() io.Reader { |
| func (fh *functionHandle) Stdin() io.WriteCloser { |
| func (fh *functionHandle) start(sh *Shell, args ...string) (Handle, error) { |
| for _, p := range []*pipe{&fh.stdin, &fh.stdout, &fh.stderr} { |
| if p.r, p.w, err = os.Pipe(); err != nil { |
| fh.bufferedStdout = bufio.NewReader(fh.stdout.r) |
| err := fh.main(fh.stdin.r, fh.stdout.w, fh.stderr.w, sh.mergeOSEnv(), args...) |
| fmt.Fprintf(fh.stderr.w, "%s\n", err) |
| func (fh *functionHandle) Shutdown(output io.Writer) { |
| scanner := bufio.NewScanner(fh.stderr.r) |
| fmt.Fprintf(output, "%s\n", scanner.Text()) |