58 lines
1.3 KiB
Go
58 lines
1.3 KiB
Go
package apperrors
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
type DeleteConflictError struct {
|
|
RelatedModules []string
|
|
}
|
|
|
|
func (e *DeleteConflictError) Error() string {
|
|
modules := cleanModules(e.RelatedModules)
|
|
if len(modules) == 0 {
|
|
return "cannot delete this data because it is currently used by another module. please remove the relation first"
|
|
}
|
|
return fmt.Sprintf(
|
|
"cannot delete this data because it is currently used by %s. please remove the relation first",
|
|
strings.Join(modules, ", "),
|
|
)
|
|
}
|
|
|
|
func IsDeleteConflict(err error) bool {
|
|
var target *DeleteConflictError
|
|
return errors.As(err, &target)
|
|
}
|
|
|
|
func AsDeleteConflict(err error) (*DeleteConflictError, bool) {
|
|
var target *DeleteConflictError
|
|
if !errors.As(err, &target) {
|
|
return nil, false
|
|
}
|
|
return target, true
|
|
}
|
|
|
|
func NewDeleteConflictError(relatedModules ...string) error {
|
|
return &DeleteConflictError{RelatedModules: cleanModules(relatedModules)}
|
|
}
|
|
|
|
func cleanModules(in []string) []string {
|
|
out := make([]string, 0, len(in))
|
|
seen := map[string]struct{}{}
|
|
for _, module := range in {
|
|
trimmed := strings.TrimSpace(module)
|
|
if trimmed == "" {
|
|
continue
|
|
}
|
|
key := strings.ToLower(trimmed)
|
|
if _, ok := seen[key]; ok {
|
|
continue
|
|
}
|
|
seen[key] = struct{}{}
|
|
out = append(out, trimmed)
|
|
}
|
|
return out
|
|
}
|