github.com/ungtb10d/cli/v2@v2.0.0-20221110210412-98537dd9d6a1/pkg/cmd/pr/create/regexp_writer.go (about)

     1  package create
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"regexp"
     7  )
     8  
     9  func NewRegexpWriter(out io.Writer, re *regexp.Regexp, repl string) *RegexpWriter {
    10  	return &RegexpWriter{out: out, re: *re, repl: repl}
    11  }
    12  
    13  type RegexpWriter struct {
    14  	out  io.Writer
    15  	re   regexp.Regexp
    16  	repl string
    17  	buf  []byte
    18  }
    19  
    20  func (s *RegexpWriter) Write(data []byte) (int, error) {
    21  	if len(data) == 0 {
    22  		return 0, nil
    23  	}
    24  
    25  	filtered := []byte{}
    26  	repl := []byte(s.repl)
    27  	lines := bytes.SplitAfter(data, []byte("\n"))
    28  
    29  	if len(s.buf) > 0 {
    30  		lines[0] = append(s.buf, lines[0]...)
    31  	}
    32  
    33  	for i, line := range lines {
    34  		if i == len(lines) {
    35  			s.buf = line
    36  		} else {
    37  			f := s.re.ReplaceAll(line, repl)
    38  			if len(f) > 0 {
    39  				filtered = append(filtered, f...)
    40  			}
    41  		}
    42  	}
    43  
    44  	if len(filtered) != 0 {
    45  		_, err := s.out.Write(filtered)
    46  		if err != nil {
    47  			return 0, err
    48  		}
    49  	}
    50  
    51  	return len(data), nil
    52  }
    53  
    54  func (s *RegexpWriter) Flush() (int, error) {
    55  	if len(s.buf) > 0 {
    56  		repl := []byte(s.repl)
    57  		filtered := s.re.ReplaceAll(s.buf, repl)
    58  		if len(filtered) > 0 {
    59  			return s.out.Write(filtered)
    60  		}
    61  	}
    62  
    63  	return 0, nil
    64  }