magefiles/docutils/block_line_replacer.go (64 lines of code) (raw):
package docutils
import (
"bytes"
"fmt"
"io"
"strings"
)
type blockLineReplacer struct {
startLine string
endLine string
replaceContent string
input *bytes.Buffer
output *bytes.Buffer
startFound bool
endFound bool
}
func (r *blockLineReplacer) Replace() (string, error) {
for {
line, err := r.input.ReadString('\n')
if err == io.EOF {
break
}
if err != nil {
return "", fmt.Errorf("error while reading issue description: %w", err)
}
r.handleLine(line)
}
return r.output.String(), nil
}
func (r *blockLineReplacer) handleLine(line string) {
r.handleStart(line)
r.handleRewrite(line)
r.handleEnd(line)
}
func (r *blockLineReplacer) handleStart(line string) {
if r.startFound || !strings.Contains(line, r.startLine) {
return
}
r.startFound = true
}
func (r *blockLineReplacer) handleRewrite(line string) {
if r.startFound && !r.endFound {
return
}
r.output.WriteString(line)
}
func (r *blockLineReplacer) handleEnd(line string) {
if !strings.Contains(line, r.endLine) {
return
}
r.endFound = true
r.output.WriteString(r.replaceContent)
}
func NewBlockLineReplacer(startLine, endLine string, input, replaceContent string) *blockLineReplacer {
return &blockLineReplacer{
startLine: startLine,
endLine: endLine,
input: bytes.NewBufferString(input),
output: new(bytes.Buffer),
replaceContent: replaceContent,
startFound: false,
endFound: false,
}
}