github.com/nektos/act@v0.2.63/pkg/common/line_writer.go (about) 1 package common 2 3 import ( 4 "bytes" 5 "io" 6 ) 7 8 // LineHandler is a callback function for handling a line 9 type LineHandler func(line string) bool 10 11 type lineWriter struct { 12 buffer bytes.Buffer 13 handlers []LineHandler 14 } 15 16 // NewLineWriter creates a new instance of a line writer 17 func NewLineWriter(handlers ...LineHandler) io.Writer { 18 w := new(lineWriter) 19 w.handlers = handlers 20 return w 21 } 22 23 func (lw *lineWriter) Write(p []byte) (n int, err error) { 24 pBuf := bytes.NewBuffer(p) 25 written := 0 26 for { 27 line, err := pBuf.ReadString('\n') 28 w, _ := lw.buffer.WriteString(line) 29 written += w 30 if err == nil { 31 lw.handleLine(lw.buffer.String()) 32 lw.buffer.Reset() 33 } else if err == io.EOF { 34 break 35 } else { 36 return written, err 37 } 38 } 39 40 return written, nil 41 } 42 43 func (lw *lineWriter) handleLine(line string) { 44 for _, h := range lw.handlers { 45 ok := h(line) 46 if !ok { 47 break 48 } 49 } 50 }