mirror of
https://github.com/go-gitea/gitea.git
synced 2025-02-21 00:34:26 +01:00
Fix: https://github.com/go-gitea/gitea/issues/31765 (Re-open #32059) --------- Co-authored-by: Bence Santha <git@santha.eu> Co-authored-by: Bence Sántha <7604637+bencurio@users.noreply.github.com> Co-authored-by: Christopher Homberger <christopher.homberger@web.de>
95 lines
2.9 KiB
Go
95 lines
2.9 KiB
Go
// Copyright 2022 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package util
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
)
|
|
|
|
// Common Errors forming the base of our error system
|
|
//
|
|
// Many Errors returned by Gitea can be tested against these errors
|
|
// using errors.Is.
|
|
var (
|
|
ErrInvalidArgument = errors.New("invalid argument")
|
|
ErrPermissionDenied = errors.New("permission denied")
|
|
ErrAlreadyExist = errors.New("resource already exists")
|
|
ErrNotExist = errors.New("resource does not exist")
|
|
)
|
|
|
|
// SilentWrap provides a simple wrapper for a wrapped error where the wrapped error message plays no part in the error message
|
|
// Especially useful for "untyped" errors created with "errors.New(…)" that can be classified as 'invalid argument', 'permission denied', 'exists already', or 'does not exist'
|
|
type SilentWrap struct {
|
|
Message string
|
|
Err error
|
|
}
|
|
|
|
// Error returns the message
|
|
func (w SilentWrap) Error() string {
|
|
return w.Message
|
|
}
|
|
|
|
// Unwrap returns the underlying error
|
|
func (w SilentWrap) Unwrap() error {
|
|
return w.Err
|
|
}
|
|
|
|
type LocaleWrap struct {
|
|
err error
|
|
TrKey string
|
|
TrArgs []any
|
|
}
|
|
|
|
// Error returns the message
|
|
func (w LocaleWrap) Error() string {
|
|
return w.err.Error()
|
|
}
|
|
|
|
// Unwrap returns the underlying error
|
|
func (w LocaleWrap) Unwrap() error {
|
|
return w.err
|
|
}
|
|
|
|
// NewSilentWrapErrorf returns an error that formats as the given text but unwraps as the provided error
|
|
func NewSilentWrapErrorf(unwrap error, message string, args ...any) error {
|
|
if len(args) == 0 {
|
|
return SilentWrap{Message: message, Err: unwrap}
|
|
}
|
|
return SilentWrap{Message: fmt.Sprintf(message, args...), Err: unwrap}
|
|
}
|
|
|
|
// NewInvalidArgumentErrorf returns an error that formats as the given text but unwraps as an ErrInvalidArgument
|
|
func NewInvalidArgumentErrorf(message string, args ...any) error {
|
|
return NewSilentWrapErrorf(ErrInvalidArgument, message, args...)
|
|
}
|
|
|
|
// NewPermissionDeniedErrorf returns an error that formats as the given text but unwraps as an ErrPermissionDenied
|
|
func NewPermissionDeniedErrorf(message string, args ...any) error {
|
|
return NewSilentWrapErrorf(ErrPermissionDenied, message, args...)
|
|
}
|
|
|
|
// NewAlreadyExistErrorf returns an error that formats as the given text but unwraps as an ErrAlreadyExist
|
|
func NewAlreadyExistErrorf(message string, args ...any) error {
|
|
return NewSilentWrapErrorf(ErrAlreadyExist, message, args...)
|
|
}
|
|
|
|
// NewNotExistErrorf returns an error that formats as the given text but unwraps as an ErrNotExist
|
|
func NewNotExistErrorf(message string, args ...any) error {
|
|
return NewSilentWrapErrorf(ErrNotExist, message, args...)
|
|
}
|
|
|
|
// ErrWrapLocale wraps an err with a translation key and arguments
|
|
func ErrWrapLocale(err error, trKey string, trArgs ...any) error {
|
|
return LocaleWrap{err: err, TrKey: trKey, TrArgs: trArgs}
|
|
}
|
|
|
|
func ErrAsLocale(err error) *LocaleWrap {
|
|
var e LocaleWrap
|
|
if errors.As(err, &e) {
|
|
return &e
|
|
}
|
|
return nil
|
|
}
|