2023-04-04 12:18:35 +02:00

97 lines
3.0 KiB
Go

// SPDX-License-Identifier: GPL-3.0-or-later
package persistence
import (
"errors"
"fmt"
"gorm.io/gorm"
)
var (
ErrJobNotFound = PersistenceError{Message: "job not found", Err: gorm.ErrRecordNotFound}
ErrTaskNotFound = PersistenceError{Message: "task not found", Err: gorm.ErrRecordNotFound}
ErrWorkerNotFound = PersistenceError{Message: "worker not found", Err: gorm.ErrRecordNotFound}
ErrWorkerClusterNotFound = PersistenceError{Message: "worker cluster not found", Err: gorm.ErrRecordNotFound}
)
type PersistenceError struct {
Message string // The error message.
Err error // Any wrapped error.
}
func (e PersistenceError) Error() string {
return fmt.Sprintf("%s: %v", e.Message, e.Err)
}
func (e PersistenceError) Is(err error) bool {
return err == e.Err
}
func jobError(errorToWrap error, message string, msgArgs ...interface{}) error {
return wrapError(translateGormJobError(errorToWrap), message, msgArgs...)
}
func taskError(errorToWrap error, message string, msgArgs ...interface{}) error {
return wrapError(translateGormTaskError(errorToWrap), message, msgArgs...)
}
func workerError(errorToWrap error, message string, msgArgs ...interface{}) error {
return wrapError(translateGormWorkerError(errorToWrap), message, msgArgs...)
}
func workerClusterError(errorToWrap error, message string, msgArgs ...interface{}) error {
return wrapError(translateGormWorkerClusterError(errorToWrap), message, msgArgs...)
}
func wrapError(errorToWrap error, message string, format ...interface{}) error {
// Only format if there are arguments for formatting.
var formattedMsg string
if len(format) > 0 {
formattedMsg = fmt.Sprintf(message, format...)
} else {
formattedMsg = message
}
return PersistenceError{
Message: formattedMsg,
Err: errorToWrap,
}
}
// translateGormJobError translates a Gorm error to a persistence layer error.
// This helps to keep Gorm as "implementation detail" of the persistence layer.
func translateGormJobError(gormError error) error {
if errors.Is(gormError, gorm.ErrRecordNotFound) {
return ErrJobNotFound
}
return gormError
}
// translateGormTaskError translates a Gorm error to a persistence layer error.
// This helps to keep Gorm as "implementation detail" of the persistence layer.
func translateGormTaskError(gormError error) error {
if errors.Is(gormError, gorm.ErrRecordNotFound) {
return ErrTaskNotFound
}
return gormError
}
// translateGormWorkerError translates a Gorm error to a persistence layer error.
// This helps to keep Gorm as "implementation detail" of the persistence layer.
func translateGormWorkerError(gormError error) error {
if errors.Is(gormError, gorm.ErrRecordNotFound) {
return ErrWorkerNotFound
}
return gormError
}
// translateGormWorkerClusterError translates a Gorm error to a persistence layer error.
// This helps to keep Gorm as "implementation detail" of the persistence layer.
func translateGormWorkerClusterError(gormError error) error {
if errors.Is(gormError, gorm.ErrRecordNotFound) {
return ErrWorkerClusterNotFound
}
return gormError
}