| // FIXME(thaJeztah): remove once we are a module; the go:build directive prevents go from downgrading language version to go1.16: |
| //go:build go1.24 |
| |
| package tui |
| |
| import ( |
| "fmt" |
| "os" |
| |
| "github.com/docker/cli/cli/streams" |
| "github.com/morikuni/aec" |
| ) |
| |
| type Output struct { |
| *streams.Out |
| noColor bool |
| } |
| |
| type terminalPrintable interface { |
| String(isTerminal bool) string |
| } |
| |
| func NewOutput(out *streams.Out) Output { |
| noColor := !out.IsTerminal() |
| if os.Getenv("NO_COLOR") != "" { |
| noColor = true |
| } |
| return Output{ |
| Out: out, |
| noColor: noColor, |
| } |
| } |
| |
| func (o Output) Color(clr aec.ANSI) aec.ANSI { |
| if o.noColor { |
| return ColorNone |
| } |
| return clr |
| } |
| |
| func (o Output) Sprint(all ...any) string { |
| var out []any |
| for _, p := range all { |
| if s, ok := p.(terminalPrintable); ok { |
| out = append(out, s.String(!o.noColor)) |
| } else { |
| out = append(out, p) |
| } |
| } |
| return fmt.Sprint(out...) |
| } |
| |
| func (o Output) PrintlnWithColor(clr aec.ANSI, args ...any) { |
| msg := o.Sprint(args...) |
| if !o.noColor { |
| msg = clr.Apply(msg) |
| } |
| _, _ = fmt.Fprintln(o.Out, msg) |
| } |
| |
| func (o Output) Println(p ...any) { |
| _, _ = fmt.Fprintln(o.Out, o.Sprint(p...)) |
| } |
| |
| func (o Output) Print(p ...any) { |
| _, _ = fmt.Print(o.Out, o.Sprint(p...)) |
| } |