From 5f7190189da7e1a765949c00dda0ea5f153401fd Mon Sep 17 00:00:00 2001 From: Thomas Boerger Date: Wed, 22 Jan 2020 11:46:49 +0100 Subject: [PATCH] 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. --- errors/errors.go | 73 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 errors/errors.go diff --git a/errors/errors.go b/errors/errors.go new file mode 100644 index 0000000..ef1990f --- /dev/null +++ b/errors/errors.go @@ -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()) + } +}