11package runner
22
33import (
4- "bufio "
4+ "bytes "
55 "errors"
66 "fmt"
77 "io"
88 "sync"
99)
1010
11- type LineWriter struct {
12- w io.Writer
11+ const (
12+ StyleReset = "\033 [0m"
13+ StyleBold = "\033 [1m"
14+ StyleFgGreen = "\033 [32m"
15+ )
16+
17+ type PrefixedWriter struct {
18+ w io.Writer
19+ prefix []byte
20+ buf * bytes.Buffer
1321}
1422
15- // Write implements io.Writer.
16- func (lw * LineWriter ) Write (p []byte ) (n int , err error ) {
17- return lw .w .Write (p )
23+ func (pw * PrefixedWriter ) Write (p []byte ) (int , error ) {
24+ defer pw .buf .Reset ()
25+ n , err := pw .buf .Write (p )
26+ if err != nil {
27+ return n , err
28+ }
29+
30+ for {
31+ line , err := pw .buf .ReadBytes ('\n' )
32+ if errors .Is (err , io .EOF ) {
33+ pw .buf .Reset ()
34+ pw .buf .Write (line )
35+ break
36+ }
37+
38+ if _ , err := pw .w .Write (append (pw .prefix , line ... )); err != nil {
39+ return n , err
40+ }
41+ }
42+ return n , nil
1843}
1944
45+ var _ io.Writer = (* PrefixedWriter )(nil )
46+
2047type LogWriter struct {
2148 w io.Writer
2249 mu sync.Mutex
@@ -33,47 +60,10 @@ func (s *LogWriter) Write(p []byte) (n int, err error) {
3360var _ io.Writer = (* LogWriter )(nil )
3461
3562func (s * LogWriter ) WithPrefix (prefix string ) io.Writer {
36- pr , pw := io .Pipe ()
37- s .wg .Add (1 )
38- go func () {
39- defer s .wg .Done ()
40- copyStreamLineByLine (prefix , s .w , pr )
41- }()
42- return & LineWriter {w : pw }
43- }
44-
45- func (s * LogWriter ) Wait () {
46- s .wg .Wait ()
47- }
48-
49- const (
50- Reset = "\033 [0m"
51- Bold = "\033 [1m"
52- Green = "\033 [32m"
53- )
54-
55- func copyStreamLineByLine (prefix string , dest io.Writer , src io.Reader ) {
56- hasPrefix := prefix != ""
57- if hasPrefix && hasANSISupport () {
58- prefix = fmt .Sprintf ("%s[%s]%s " , Green , prefix , Reset )
63+ if prefix != "" && hasANSISupport () {
64+ prefix = fmt .Sprintf ("%s[%s]%s " , StyleFgGreen , prefix , StyleReset )
5965 // prefix = fmt.Sprintf("%s%s |%s ", Green, prefix, Reset)
6066 }
61- r := bufio .NewReader (src )
62- for {
63- b , err := r .ReadBytes ('\n' )
64- if err != nil {
65- if errors .Is (err , io .EOF ) {
66- if hasPrefix {
67- dest .Write ([]byte (prefix ))
68- }
69- dest .Write (b )
70- return
71- }
72- }
7367
74- if hasPrefix {
75- dest .Write ([]byte (prefix ))
76- }
77- dest .Write (b )
78- }
68+ return & PrefixedWriter {s .w , []byte (prefix ), bytes .NewBuffer (nil )}
7969}
0 commit comments