github.com/demonoid81/moby@v0.0.0-20200517203328-62dd8e17c460/pkg/streamformatter/streamwriter.go (about) 1 package streamformatter // import "github.com/demonoid81/moby/pkg/streamformatter" 2 3 import ( 4 "encoding/json" 5 "io" 6 7 "github.com/demonoid81/moby/pkg/jsonmessage" 8 ) 9 10 type streamWriter struct { 11 io.Writer 12 lineFormat func([]byte) string 13 } 14 15 func (sw *streamWriter) Write(buf []byte) (int, error) { 16 formattedBuf := sw.format(buf) 17 n, err := sw.Writer.Write(formattedBuf) 18 if n != len(formattedBuf) { 19 return n, io.ErrShortWrite 20 } 21 return len(buf), err 22 } 23 24 func (sw *streamWriter) format(buf []byte) []byte { 25 msg := &jsonmessage.JSONMessage{Stream: sw.lineFormat(buf)} 26 b, err := json.Marshal(msg) 27 if err != nil { 28 return FormatError(err) 29 } 30 return appendNewline(b) 31 } 32 33 // NewStdoutWriter returns a writer which formats the output as json message 34 // representing stdout lines 35 func NewStdoutWriter(out io.Writer) io.Writer { 36 return &streamWriter{Writer: out, lineFormat: func(buf []byte) string { 37 return string(buf) 38 }} 39 } 40 41 // NewStderrWriter returns a writer which formats the output as json message 42 // representing stderr lines 43 func NewStderrWriter(out io.Writer) io.Writer { 44 return &streamWriter{Writer: out, lineFormat: func(buf []byte) string { 45 return "\033[91m" + string(buf) + "\033[0m" 46 }} 47 }