mirror of
https://github.com/fluxcd/flagger.git
synced 2026-04-15 06:57:34 +00:00
149 lines
3.6 KiB
Go
149 lines
3.6 KiB
Go
package pp
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"runtime"
|
|
"sync"
|
|
|
|
"github.com/mattn/go-colorable"
|
|
)
|
|
|
|
var (
|
|
out io.Writer
|
|
outLock sync.Mutex
|
|
|
|
defaultOut = colorable.NewColorableStdout()
|
|
|
|
currentScheme ColorScheme
|
|
// WithLineInfo add file name and line information to output
|
|
// call this function with care, because getting stack has performance penalty
|
|
WithLineInfo = false
|
|
)
|
|
|
|
func init() {
|
|
out = defaultOut
|
|
currentScheme = defaultScheme
|
|
}
|
|
|
|
// Print prints given arguments.
|
|
func Print(a ...interface{}) (n int, err error) {
|
|
return fmt.Fprint(out, formatAll(a)...)
|
|
}
|
|
|
|
// Printf prints a given format.
|
|
func Printf(format string, a ...interface{}) (n int, err error) {
|
|
return fmt.Fprintf(out, format, formatAll(a)...)
|
|
}
|
|
|
|
// Println prints given arguments with newline.
|
|
func Println(a ...interface{}) (n int, err error) {
|
|
return fmt.Fprintln(out, formatAll(a)...)
|
|
}
|
|
|
|
// Sprint formats given arguemnts and returns the result as string.
|
|
func Sprint(a ...interface{}) string {
|
|
return fmt.Sprint(formatAll(a)...)
|
|
}
|
|
|
|
// Sprintf formats with pretty print and returns the result as string.
|
|
func Sprintf(format string, a ...interface{}) string {
|
|
return fmt.Sprintf(format, formatAll(a)...)
|
|
}
|
|
|
|
// Sprintln formats given arguemnts with newline and returns the result as string.
|
|
func Sprintln(a ...interface{}) string {
|
|
return fmt.Sprintln(formatAll(a)...)
|
|
}
|
|
|
|
// Fprint prints given arguments to a given writer.
|
|
func Fprint(w io.Writer, a ...interface{}) (n int, err error) {
|
|
return fmt.Fprint(w, formatAll(a)...)
|
|
}
|
|
|
|
// Fprintf prints format to a given writer.
|
|
func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) {
|
|
return fmt.Fprintf(w, format, formatAll(a)...)
|
|
}
|
|
|
|
// Fprintln prints given arguments to a given writer with newline.
|
|
func Fprintln(w io.Writer, a ...interface{}) (n int, err error) {
|
|
return fmt.Fprintln(w, formatAll(a)...)
|
|
}
|
|
|
|
// Errorf formats given arguments and returns it as error type.
|
|
func Errorf(format string, a ...interface{}) error {
|
|
return errors.New(Sprintf(format, a...))
|
|
}
|
|
|
|
// Fatal prints given arguments and finishes execution with exit status 1.
|
|
func Fatal(a ...interface{}) {
|
|
fmt.Fprint(out, formatAll(a)...)
|
|
os.Exit(1)
|
|
}
|
|
|
|
// Fatalf prints a given format and finishes execution with exit status 1.
|
|
func Fatalf(format string, a ...interface{}) {
|
|
fmt.Fprintf(out, format, formatAll(a)...)
|
|
os.Exit(1)
|
|
}
|
|
|
|
// Fatalln prints given arguments with newline and finishes execution with exit status 1.
|
|
func Fatalln(a ...interface{}) {
|
|
fmt.Fprintln(out, formatAll(a)...)
|
|
os.Exit(1)
|
|
}
|
|
|
|
// Change Print* functions' output to a given writer.
|
|
// For example, you can limit output by ENV.
|
|
//
|
|
// func init() {
|
|
// if os.Getenv("DEBUG") == "" {
|
|
// pp.SetDefaultOutput(ioutil.Discard)
|
|
// }
|
|
// }
|
|
func SetDefaultOutput(o io.Writer) {
|
|
outLock.Lock()
|
|
out = o
|
|
outLock.Unlock()
|
|
}
|
|
|
|
// GetDefaultOutput returns pp's default output.
|
|
func GetDefaultOutput() io.Writer {
|
|
return out
|
|
}
|
|
|
|
// Change Print* functions' output to default one.
|
|
func ResetDefaultOutput() {
|
|
outLock.Lock()
|
|
out = defaultOut
|
|
outLock.Unlock()
|
|
}
|
|
|
|
// SetColorScheme takes a colorscheme used by all future Print calls.
|
|
func SetColorScheme(scheme ColorScheme) {
|
|
scheme.fixColors()
|
|
currentScheme = scheme
|
|
}
|
|
|
|
// ResetColorScheme resets colorscheme to default.
|
|
func ResetColorScheme() {
|
|
currentScheme = defaultScheme
|
|
}
|
|
|
|
func formatAll(objects []interface{}) []interface{} {
|
|
results := []interface{}{}
|
|
|
|
if WithLineInfo {
|
|
_, fn, line, _ := runtime.Caller(2) // 2 because current Caller is pp itself
|
|
results = append(results, fmt.Sprintf("%s:%d\n", fn, line))
|
|
}
|
|
|
|
for _, object := range objects {
|
|
results = append(results, format(object))
|
|
}
|
|
return results
|
|
}
|