Add errors package for exit code handling

To get a better exit code handling including logrus logging I have
defined a custom errors package which uses logrus to log error messages.
This commit is contained in:
Thomas Boerger 2020-01-22 11:46:49 +01:00
parent 7d346ea6f4
commit 5f7190189d
No known key found for this signature in database
GPG Key ID: 09745AFF9D63C79B
1 changed files with 73 additions and 0 deletions

73
errors/errors.go Normal file
View File

@ -0,0 +1,73 @@
package errors
import (
"fmt"
"os"
"github.com/sirupsen/logrus"
)
// ExitCoder defines the interface for exit code handling.
type ExitCoder interface {
error
Code() int
Fields() logrus.Fields
}
// ExitError simply implements the defined interface.
type ExitError struct {
message interface{}
code int
fields logrus.Fields
}
// Error implements the ExitCoder interface.
func (e ExitError) Error() string {
return fmt.Sprintf("%v", e.message)
}
// Code implements the ExitCoder interface.
func (e ExitError) Code() int {
return e.code
}
// Fields implements the ExitCoder interface.
func (e ExitError) Fields() logrus.Fields {
return e.fields
}
// ExitMessage initiales a new ExitCoder implementation.
func ExitMessage(message interface{}) ExitError {
return ExitError{
message: message,
code: 1,
}
}
// WithFields initiales a new ExitCoder implementation.
func WithFields(message interface{}, fields logrus.Fields) ExitError {
return ExitError{
message: message,
code: 1,
fields: fields,
}
}
// HandleExit ist used within the main handler to exit properly.
func HandleExit(err error) {
if err == nil {
return
}
if e, ok := err.(ExitCoder); ok {
if e.Error() != "" {
logrus.WithFields(
e.Fields(),
).Error(
e.Error(),
)
}
os.Exit(e.Code())
}
}