1
0
mirror of https://github.com/go-task/task.git synced 2025-11-23 22:24:45 +02:00
Files
task/internal/output/group.go

61 lines
1.2 KiB
Go
Raw Normal View History

package output
import (
"bytes"
"io"
"github.com/go-task/task/v3/internal/templater"
)
type Group struct {
Begin, End string
ErrorOnly bool
}
func (g Group) WrapWriter(stdOut, _ io.Writer, _ string, cache *templater.Cache) (io.Writer, io.Writer, CloseFunc) {
gw := &groupWriter{writer: stdOut}
if g.Begin != "" {
gw.begin = templater.Replace(g.Begin, cache) + "\n"
}
if g.End != "" {
gw.end = templater.Replace(g.End, cache) + "\n"
}
return gw, gw, func(err error) error {
if g.ErrorOnly && err == nil {
return nil
}
return gw.close()
}
}
type groupWriter struct {
writer io.Writer
buff bytes.Buffer
begin, end string
}
func (gw *groupWriter) Write(p []byte) (int, error) {
return gw.buff.Write(p)
}
func (gw *groupWriter) close() error {
2025-11-11 14:37:16 -03:00
switch {
case gw.buff.Len() == 0:
return nil
2025-11-11 14:37:16 -03:00
case gw.begin == "" && gw.end == "":
_, err := io.Copy(gw.writer, &gw.buff)
return err
default:
_, err := io.Copy(gw.writer, gw.combinedBuff())
return err
}
2025-11-11 14:37:16 -03:00
}
func (gw *groupWriter) combinedBuff() io.Reader {
var b bytes.Buffer
_, _ = b.WriteString(gw.begin)
_, _ = io.Copy(&b, &gw.buff)
_, _ = b.WriteString(gw.end)
return &b
}