diff --git a/logging/funcs_multilogger.go b/logging/funcs_multilogger.go index 64c4d6d..1c2dc50 100644 --- a/logging/funcs_multilogger.go +++ b/logging/funcs_multilogger.go @@ -114,7 +114,9 @@ func (m *MultiLogger) Alert(s string, v ...interface{}) (err error) { wg.Wait() - err = e + if !e.IsEmpty() { + err = e + } return } @@ -143,7 +145,9 @@ func (m *MultiLogger) Crit(s string, v ...interface{}) (err error) { wg.Wait() - err = e + if !e.IsEmpty() { + err = e + } return } @@ -172,8 +176,9 @@ func (m *MultiLogger) Debug(s string, v ...interface{}) (err error) { wg.Wait() - err = e - + if !e.IsEmpty() { + err = e + } return } @@ -201,8 +206,9 @@ func (m *MultiLogger) Emerg(s string, v ...interface{}) (err error) { wg.Wait() - err = e - + if !e.IsEmpty() { + err = e + } return } @@ -230,7 +236,9 @@ func (m *MultiLogger) Err(s string, v ...interface{}) (err error) { wg.Wait() - err = e + if !e.IsEmpty() { + err = e + } return } @@ -259,7 +267,9 @@ func (m *MultiLogger) Info(s string, v ...interface{}) (err error) { wg.Wait() - err = e + if !e.IsEmpty() { + err = e + } return } @@ -288,7 +298,9 @@ func (m *MultiLogger) Notice(s string, v ...interface{}) (err error) { wg.Wait() - err = e + if !e.IsEmpty() { + err = e + } return } @@ -317,7 +329,9 @@ func (m *MultiLogger) Warning(s string, v ...interface{}) (err error) { wg.Wait() - err = e + if !e.IsEmpty() { + err = e + } return } diff --git a/multierr/doc.go b/multierr/doc.go index e7610ce..6b0a8d4 100644 --- a/multierr/doc.go +++ b/multierr/doc.go @@ -25,7 +25,7 @@ Example: } if errs != nil && len(errs) != 0 { - // err now contains multiple errors presented as a single error. + // err now contains multiple errors presented as a single error interface. err = multierr.NewErrors(errs...) } } @@ -50,7 +50,12 @@ MultiError also has a shorthand, making the above much less verbose: } }() } - // multierror now contains any/all errors above. + + // multierror now contains any/all errors above. If calling in a function, you'll probably want to do: + // if !multierror.IsEmpty() { + // err = multierror + // } + } In the above, the multierror assignment can still be used as an error. diff --git a/multierr/funcs.go b/multierr/funcs.go index 939f3b9..b10dda9 100644 --- a/multierr/funcs.go +++ b/multierr/funcs.go @@ -39,12 +39,19 @@ func NewErrors(errs ...error) (err error) { // NewMultiError will provide a MultiError (true type), optionally initialized with errors. func NewMultiError(errs ...error) (m *MultiError) { - if errs == nil { - errs = make([]error, 0) + var realErrs []error = make([]error, 0) + + if errs != nil { + for _, e := range errs { + if e == nil { + continue + } + realErrs = append(realErrs, e) + } } m = &MultiError{ - Errors: errs, + Errors: realErrs, ErrorSep: "\n", } @@ -83,3 +90,21 @@ func (e *MultiError) AddError(err error) { e.Errors = append(e.Errors, err) } + +// Count returns the number of errors in a MultiError. +func (e *MultiError) Count() (n int) { + + n = len(e.Errors) + + return +} + +// IsEmpty is a shorthand for testing if e.Errors is empty. +func (e *MultiError) IsEmpty() (empty bool) { + + if e.Count() == 0 { + empty = true + } + + return +}