1package report
2
3import (
4	"fmt"
5	"io"
6	"strings"
7	"time"
8
9	"github.com/sirupsen/logrus"
10
11	"github.com/sensu/sensu-go/cli/elements/globals"
12)
13
14// Report reports debug, warning, & errors
15type Report struct {
16	Out      io.Writer
17	LogLevel logrus.Level
18
19	entries []Entry
20}
21
22// New returns new report w/ log level preconfigured
23func New() Report {
24	return Report{LogLevel: logrus.InfoLevel}
25}
26
27// Flush pops entries from list and writes them
28func (r *Report) Flush() error {
29	entries := make([]Entry, len(r.entries))
30	copy(entries, r.entries)
31	r.entries = []Entry{}
32
33	for _, entry := range entries {
34		if entry.Level > r.LogLevel {
35			continue
36		}
37
38		level := strings.ToUpper(entry.Level.String())
39		if entry.Level == logrus.WarnLevel {
40			level = globals.WarningStyle(level)
41		} else if entry.Level <= logrus.ErrorLevel {
42			level = globals.ErrorTextStyle(level)
43		} else if entry.Level == logrus.InfoLevel {
44			level = globals.PrimaryTextStyle(level)
45		}
46
47		fmt.Fprintf(
48			r.Out,
49			"%s\r\t%s\n",
50			level,
51			entry.Message,
52		)
53	}
54
55	return nil
56}
57
58// HasWarnings returns true if there are any warnings entries in the report
59func (r *Report) HasWarnings() bool {
60	for _, entry := range r.entries {
61		if entry.Level == logrus.WarnLevel {
62			return true
63		}
64	}
65
66	return false
67}
68
69// HasErrors returns true if there are any error entries in the report
70func (r *Report) HasErrors() bool {
71	for _, entry := range r.entries {
72		if entry.Level <= logrus.ErrorLevel {
73			return true
74		}
75	}
76
77	return false
78}
79
80// AddEntry adds given entry to report
81func (r *Report) AddEntry(e Entry) {
82	r.entries = append(r.entries, e)
83}
84
85// Entry ...
86type Entry struct {
87	Level   logrus.Level
88	Message string
89	Context map[string]interface{}
90	Time    time.Time
91}
92