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  }