...
1
2
3 package gexec
4
5 import (
6 "io"
7 "sync"
8 )
9
10
17 type PrefixedWriter struct {
18 prefix []byte
19 writer io.Writer
20 lock *sync.Mutex
21 atStartOfLine bool
22 }
23
24 func NewPrefixedWriter(prefix string, writer io.Writer) *PrefixedWriter {
25 return &PrefixedWriter{
26 prefix: []byte(prefix),
27 writer: writer,
28 lock: &sync.Mutex{},
29 atStartOfLine: true,
30 }
31 }
32
33 func (w *PrefixedWriter) Write(b []byte) (int, error) {
34 w.lock.Lock()
35 defer w.lock.Unlock()
36
37 toWrite := []byte{}
38
39 for _, c := range b {
40 if w.atStartOfLine {
41 toWrite = append(toWrite, w.prefix...)
42 }
43
44 toWrite = append(toWrite, c)
45
46 w.atStartOfLine = c == '\n'
47 }
48
49 _, err := w.writer.Write(toWrite)
50 if err != nil {
51 return 0, err
52 }
53
54 return len(b), nil
55 }
56
View as plain text