45 lines
920 B
Go
45 lines
920 B
Go
package exec
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
|
|
"github.com/docker/docker/pkg/stdcopy"
|
|
)
|
|
|
|
// ProcessOptions defines options applicable to the reader processor
|
|
type ProcessOptions struct {
|
|
Reader io.Reader
|
|
}
|
|
|
|
// ProcessOption defines a common interface to modify the reader processor
|
|
// These options can be passed to the Exec function in a variadic way to customize the returned Reader instance
|
|
type ProcessOption interface {
|
|
Apply(opts *ProcessOptions)
|
|
}
|
|
|
|
type ProcessOptionFunc func(opts *ProcessOptions)
|
|
|
|
func (fn ProcessOptionFunc) Apply(opts *ProcessOptions) {
|
|
fn(opts)
|
|
}
|
|
|
|
func Multiplexed() ProcessOption {
|
|
return ProcessOptionFunc(func(opts *ProcessOptions) {
|
|
done := make(chan struct{})
|
|
|
|
var outBuff bytes.Buffer
|
|
var errBuff bytes.Buffer
|
|
go func() {
|
|
if _, err := stdcopy.StdCopy(&outBuff, &errBuff, opts.Reader); err != nil {
|
|
return
|
|
}
|
|
close(done)
|
|
}()
|
|
|
|
<-done
|
|
|
|
opts.Reader = &outBuff
|
|
})
|
|
}
|