drone-plugin-lib/errors/errors.go

82 lines
1.5 KiB
Go

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 initializes a new ExitCoder implementation.
func ExitMessage(message interface{}) ExitError {
return ExitError{
message: message,
code: 1,
}
}
// ExitMessagef initializes a new ExitCoder implementation.
func ExitMessagef(format string, a ...interface{}) ExitError {
return ExitError{
message: fmt.Errorf(format, a...),
code: 1,
}
}
// WithFields initializes 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())
}
}