/
log.go
128 lines (104 loc) · 2.83 KB
/
log.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package log
import (
"fmt"
"os"
"github.com/sirupsen/logrus"
"github.com/fatih/color"
"gopkg.in/AlecAivazis/survey.v1/terminal"
)
func Infof(msg string, args ...interface{}) {
Info(fmt.Sprintf(msg, args...))
}
func Info(msg string) {
fmt.Fprint(terminal.NewAnsiStdout(os.Stdout), msg)
}
func Infoln(msg string) {
fmt.Fprintln(terminal.NewAnsiStdout(os.Stdout), msg)
}
func Blank() {
fmt.Println()
}
func Warnf(msg string, args ...interface{}) {
Warn(fmt.Sprintf(msg, args...))
}
func Warn(msg string) {
color.Yellow(msg)
}
func Errorf(msg string, args ...interface{}) {
Error(fmt.Sprintf(msg, args...))
}
func Error(msg string) {
color.Red(msg)
}
// Prints an error msg with a new line at the end
func Errorln(msg string) {
Errorf("%v\n", msg)
}
func Fatalf(msg string, args ...interface{}) {
Fatal(fmt.Sprintf(msg, args...))
}
func Fatal(msg string) {
color.Red(msg)
}
func Success(msg string) {
color.Green(msg)
}
func Successf(msg string, args ...interface{}) {
Success(fmt.Sprintf(msg, args...))
}
func Failure(msg string) {
color.Red(msg)
}
func Failuref(msg string, args ...interface{}) {
Failure(fmt.Sprintf(msg, args...))
}
// AskForConfirmation uses Scanln to parse user input. A user must type in "yes" or "no" and
// then press enter. It has fuzzy matching, so "y", "Y", "yes", "YES", and "Yes" all count as
// confirmations. If the input is not recognized, it will ask again. The function does not return
// until it gets a valid response from the user. Typically, you should use fmt to print out a question
// before calling askForConfirmation. E.g. fmt.Println("WARNING: Are you sure? (yes/no)")
func AskForConfirmation(def bool) bool {
var response string
fmt.Scanln(&response)
if len(response) == 0 {
return def
}
okayResponses := []string{"y", "Y", "yes", "Yes", "YES"}
nokayResponses := []string{"n", "N", "no", "No", "NO"}
if containsString(okayResponses, response) {
return true
} else if containsString(nokayResponses, response) {
return false
} else {
Warn("Please type y or n & press enter: ")
return AskForConfirmation(def)
}
}
// posString returns the first index of element in slice.
// If slice does not contain element, returns -1.
func posString(slice []string, element string) int {
for index, elem := range slice {
if elem == element {
return index
}
}
return -1
}
// containsString returns true iff slice contains element
func containsString(slice []string, element string) bool {
return !(posString(slice, element) == -1)
}
type SimpleLogFormatter struct {
}
func (f *SimpleLogFormatter) Format(entry *logrus.Entry) ([]byte, error) {
return []byte(fmt.Sprintf(entry.Message) + "\n"), nil
}
func ConfigureLog(level string) {
logrus.SetFormatter(&SimpleLogFormatter{})
lvl, err := logrus.ParseLevel(level)
if err != nil {
fmt.Println(err.Error())
os.Exit(-1)
}
logrus.SetLevel(lvl)
}