mirror of
https://github.com/RoBaertschi/tt.git
synced 2025-04-15 21:43:30 +00:00
56 lines
1.0 KiB
Go
56 lines
1.0 KiB
Go
package utils
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
)
|
|
|
|
// Prefix writer writes a prefix before each new line from another io.Writer
|
|
type PrefixWriter struct {
|
|
output io.Writer
|
|
outputPrefix []byte
|
|
outputPrefixWritten bool
|
|
}
|
|
|
|
func NewPrefixWriter(output io.Writer, prefix []byte) *PrefixWriter {
|
|
return &PrefixWriter{
|
|
output: output,
|
|
outputPrefix: prefix,
|
|
}
|
|
}
|
|
|
|
func NewPrefixWriterString(output io.Writer, prefix string) *PrefixWriter {
|
|
return &PrefixWriter{
|
|
output: output,
|
|
outputPrefix: []byte(prefix),
|
|
}
|
|
}
|
|
|
|
func (w *PrefixWriter) Write(p []byte) (n int, err error) {
|
|
|
|
toWrites := bytes.SplitAfter(p, []byte{'\n'})
|
|
|
|
for _, toWrite := range toWrites {
|
|
if len(toWrite) <= 0 {
|
|
continue
|
|
}
|
|
if !w.outputPrefixWritten {
|
|
w.outputPrefixWritten = true
|
|
w.output.Write(w.outputPrefix)
|
|
}
|
|
|
|
if bytes.Contains(toWrite, []byte{'\n'}) {
|
|
w.outputPrefixWritten = false
|
|
}
|
|
|
|
var written int
|
|
written, err = w.output.Write(toWrite)
|
|
n += written
|
|
if err != nil {
|
|
return
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|