1package ui
2
3import (
4	"fmt"
5	"io"
6	"os"
7
8	"github.com/mattn/go-colorable"
9	"github.com/mattn/go-isatty"
10)
11
12type UI interface {
13	Print(a ...interface{}) (n int, err error)
14	Printf(format string, a ...interface{}) (n int, err error)
15	Println(a ...interface{}) (n int, err error)
16	Errorf(format string, a ...interface{}) (n int, err error)
17	Errorln(a ...interface{}) (n int, err error)
18}
19
20var (
21	Stdout     = colorable.NewColorableStdout()
22	Stderr     = colorable.NewColorableStderr()
23	Default UI = Console{Stdout: Stdout, Stderr: Stderr}
24)
25
26func Print(a ...interface{}) (n int) {
27	n, err := Default.Print(a...)
28	if err != nil {
29		// If something as basic as printing to stdout fails, just panic and exit
30		os.Exit(1)
31	}
32	return
33}
34
35func Printf(format string, a ...interface{}) (n int) {
36	n, err := Default.Printf(format, a...)
37	if err != nil {
38		// If something as basic as printing to stdout fails, just panic and exit
39		os.Exit(1)
40	}
41	return
42}
43
44func Println(a ...interface{}) (n int) {
45	n, err := Default.Println(a...)
46	if err != nil {
47		// If something as basic as printing to stdout fails, just panic and exit
48		os.Exit(1)
49	}
50	return
51}
52
53func Errorf(format string, a ...interface{}) (n int) {
54	n, err := Default.Errorf(format, a...)
55	if err != nil {
56		// If something as basic as printing to stderr fails, just panic and exit
57		os.Exit(1)
58	}
59	return
60}
61
62func Errorln(a ...interface{}) (n int) {
63	n, err := Default.Errorln(a...)
64	if err != nil {
65		// If something as basic as printing to stderr fails, just panic and exit
66		os.Exit(1)
67	}
68	return
69}
70
71func IsTerminal(f *os.File) bool {
72	return isatty.IsTerminal(f.Fd())
73}
74
75type Console struct {
76	Stdout io.Writer
77	Stderr io.Writer
78}
79
80func (c Console) Print(a ...interface{}) (n int, err error) {
81	return fmt.Fprint(c.Stdout, a...)
82}
83
84func (c Console) Printf(format string, a ...interface{}) (n int, err error) {
85	return fmt.Fprintf(c.Stdout, format, a...)
86}
87
88func (c Console) Println(a ...interface{}) (n int, err error) {
89	return fmt.Fprintln(c.Stdout, a...)
90}
91
92func (c Console) Errorf(format string, a ...interface{}) (n int, err error) {
93	return fmt.Fprintf(c.Stderr, format, a...)
94}
95
96func (c Console) Errorln(a ...interface{}) (n int, err error) {
97	return fmt.Fprintln(c.Stderr, a...)
98}
99