From 06cab9921d64d96cd2d431a8629eefb20befe483 Mon Sep 17 00:00:00 2001 From: Pavel Date: Wed, 30 Oct 2019 17:02:11 +0300 Subject: [PATCH] error collector (mostly for migrations) --- core/error_collector.go | 38 ++++++++++++++++++++++++++++++++++ core/error_collector_test.go | 40 ++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 core/error_collector.go create mode 100644 core/error_collector_test.go diff --git a/core/error_collector.go b/core/error_collector.go new file mode 100644 index 0000000..f494ebb --- /dev/null +++ b/core/error_collector.go @@ -0,0 +1,38 @@ +package core + +import ( + "github.com/pkg/errors" +) + +// ErrorCollector can be used to group several error calls into one call. +// It is mostly useful in GORM migrations, where you should return only one errors, but several can occur. +// Error messages are composed into one message. For example: +// err := core.ErrorCollector( +// errors.New("first"), +// errors.New("second") +// ) +// +// // Will output `first < second` +// fmt.Println(err.Error()) +// Example with GORM migration, returns one migration error with all error messages: +// return core.ErrorCollector( +// db.CreateTable(models.Account{}, models.Connection{}).Error, +// db.Table("account").AddUniqueIndex("account_key", "channel").Error, +// ) +func ErrorCollector(errorsList ...error) error { + var errorMsg string + + for _, errItem := range errorsList { + if errItem == nil { + continue + } + + errorMsg += "< " + errItem.Error() + " " + } + + if errorMsg != "" { + return errors.New(errorMsg[2 : len(errorMsg)-1]) + } + + return nil +} diff --git a/core/error_collector_test.go b/core/error_collector_test.go new file mode 100644 index 0000000..5eaf6ea --- /dev/null +++ b/core/error_collector_test.go @@ -0,0 +1,40 @@ +package core + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestErrorCollector_NoError(t *testing.T) { + err := ErrorCollector(nil, nil, nil) + + assert.NoError(t, err) + assert.Nil(t, err) +} + +func TestErrorCollector_SeveralErrors(t *testing.T) { + err := ErrorCollector(nil, errors.New("error text"), nil) + + assert.Error(t, err) + assert.Equal(t, "error text", err.Error()) +} + +func TestErrorCollector_EmptyErrorMessage(t *testing.T) { + err := ErrorCollector(nil, errors.New(""), nil) + + assert.Error(t, err) + assert.Equal(t, "", err.Error()) +} + +func TestErrorCollector_AllErrors(t *testing.T) { + err := ErrorCollector( + errors.New("first"), + errors.New("second"), + errors.New("third"), + ) + + assert.Error(t, err) + assert.Equal(t, "first < second < third", err.Error()) +}