mirror of
https://github.com/retailcrm/mg-transport-core.git
synced 2024-11-25 14:46:02 +03:00
error collector (mostly for migrations)
This commit is contained in:
parent
f2b79fad5c
commit
06cab9921d
38
core/error_collector.go
Normal file
38
core/error_collector.go
Normal file
@ -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
|
||||
}
|
40
core/error_collector_test.go
Normal file
40
core/error_collector_test.go
Normal file
@ -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())
|
||||
}
|
Loading…
Reference in New Issue
Block a user