| package streamformatter // import "github.com/docker/docker/pkg/streamformatter" |
| |
| import ( |
| "encoding/json" |
| "io" |
| |
| "github.com/docker/docker/pkg/jsonmessage" |
| ) |
| |
| type streamWriter struct { |
| io.Writer |
| lineFormat func([]byte) string |
| } |
| |
| func (sw *streamWriter) Write(buf []byte) (int, error) { |
| formattedBuf := sw.format(buf) |
| n, err := sw.Writer.Write(formattedBuf) |
| if n != len(formattedBuf) { |
| return n, io.ErrShortWrite |
| } |
| return len(buf), err |
| } |
| |
| func (sw *streamWriter) format(buf []byte) []byte { |
| msg := &jsonmessage.JSONMessage{Stream: sw.lineFormat(buf)} |
| b, err := json.Marshal(msg) |
| if err != nil { |
| return FormatError(err) |
| } |
| return appendNewline(b) |
| } |
| |
| // NewStdoutWriter returns a writer which formats the output as json message |
| // representing stdout lines |
| func NewStdoutWriter(out io.Writer) io.Writer { |
| return &streamWriter{Writer: out, lineFormat: func(buf []byte) string { |
| return string(buf) |
| }} |
| } |
| |
| // NewStderrWriter returns a writer which formats the output as json message |
| // representing stderr lines |
| func NewStderrWriter(out io.Writer) io.Writer { |
| return &streamWriter{Writer: out, lineFormat: func(buf []byte) string { |
| return "\033[91m" + string(buf) + "\033[0m" |
| }} |
| } |