logfrog-go/errors.go

94 lines
3.0 KiB
Go

package logfrog
import (
"fmt"
"reflect"
"strings"
)
func getType(v interface{}) string {
if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr {
return "*" + t.Elem().PkgPath() + "." + t.Elem().Name()
} else {
return t.PkgPath() + "." + t.Name()
}
}
type ErrorSource struct {
// fully-quallified name of the source object
Source string
Error error
}
// --------------------------------------------------------------------------------
type ErrLoggerCloseFailure struct {
ProcessorCloseErrors []ErrorSource
HandlerCloseErrors []ErrorSource
}
func (e *ErrLoggerCloseFailure) addProcessorError(v interface{}, err error) {
e.ProcessorCloseErrors = append(e.ProcessorCloseErrors, ErrorSource{ getType(v), err })
}
func (e *ErrLoggerCloseFailure) addHandlerError(v interface{}, err error) {
e.HandlerCloseErrors = append(e.HandlerCloseErrors, ErrorSource{ getType(v), err })
}
func (e *ErrLoggerCloseFailure) containsErrors() bool {
return (len(e.ProcessorCloseErrors) > 0) || (len(e.HandlerCloseErrors) > 0)
}
func (e *ErrLoggerCloseFailure) Error() string {
var errorTexts []string
if len(e.ProcessorCloseErrors) > 0 {
errorTexts = append(errorTexts, fmt.Sprintf("%d processor errors", len(e.ProcessorCloseErrors)))
}
if len(e.HandlerCloseErrors) > 0 {
errorTexts = append(errorTexts, fmt.Sprintf("%d handler errors", len(e.HandlerCloseErrors)))
}
return fmt.Sprintf("error while closing logger: %s", strings.Join(errorTexts, ", "))
}
// --------------------------------------------------------------------------------
type ErrHandlerCloseFailure struct {
ProcessorCloseErrors []ErrorSource
FormatterCloseError *ErrorSource
HandlerOnCloseError *ErrorSource
}
func (e *ErrHandlerCloseFailure) addProcessorError(v interface{}, err error) {
e.ProcessorCloseErrors = append(e.ProcessorCloseErrors, ErrorSource{ getType(v), err })
}
func (e *ErrHandlerCloseFailure) setFormatterError(v interface{}, err error) {
e.FormatterCloseError = &ErrorSource{ getType(v), err }
}
func (e *ErrHandlerCloseFailure) setHandlerError(v interface{}, err error) {
e.HandlerOnCloseError = &ErrorSource{ getType(v), err }
}
func (e *ErrHandlerCloseFailure) containsErrors() bool {
return (len(e.ProcessorCloseErrors) > 0) || (e.FormatterCloseError != nil) || (e.HandlerOnCloseError != nil)
}
func (e *ErrHandlerCloseFailure) Error() string {
var errorTexts []string
if len(e.ProcessorCloseErrors) > 0 {
errorTexts = append(errorTexts, fmt.Sprintf("%d processor errors", len(e.ProcessorCloseErrors)))
}
if e.FormatterCloseError != nil {
errorTexts = append(errorTexts, "a formatter error")
}
if e.HandlerOnCloseError != nil {
errorTexts = append(errorTexts, "a handler's OnClose() error")
}
return fmt.Sprintf("error while closing logger: %s", strings.Join(errorTexts, ", "))
}
// --------------------------------------------------------------------------------