code.gitea.io/gitea@v1.19.3/modules/util/error.go (about)

     1  // Copyright 2022 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package util
     5  
     6  import (
     7  	"errors"
     8  	"fmt"
     9  )
    10  
    11  // Common Errors forming the base of our error system
    12  //
    13  // Many Errors returned by Gitea can be tested against these errors
    14  // using errors.Is.
    15  var (
    16  	ErrInvalidArgument  = errors.New("invalid argument")
    17  	ErrPermissionDenied = errors.New("permission denied")
    18  	ErrAlreadyExist     = errors.New("resource already exists")
    19  	ErrNotExist         = errors.New("resource does not exist")
    20  )
    21  
    22  // SilentWrap provides a simple wrapper for a wrapped error where the wrapped error message plays no part in the error message
    23  // Especially useful for "untyped" errors created with "errors.New(…)" that can be classified as 'invalid argument', 'permission denied', 'exists already', or 'does not exist'
    24  type SilentWrap struct {
    25  	Message string
    26  	Err     error
    27  }
    28  
    29  // Error returns the message
    30  func (w SilentWrap) Error() string {
    31  	return w.Message
    32  }
    33  
    34  // Unwrap returns the underlying error
    35  func (w SilentWrap) Unwrap() error {
    36  	return w.Err
    37  }
    38  
    39  // NewSilentWrapErrorf returns an error that formats as the given text but unwraps as the provided error
    40  func NewSilentWrapErrorf(unwrap error, message string, args ...interface{}) error {
    41  	if len(args) == 0 {
    42  		return SilentWrap{Message: message, Err: unwrap}
    43  	}
    44  	return SilentWrap{Message: fmt.Sprintf(message, args...), Err: unwrap}
    45  }
    46  
    47  // NewInvalidArgumentErrorf returns an error that formats as the given text but unwraps as an ErrInvalidArgument
    48  func NewInvalidArgumentErrorf(message string, args ...interface{}) error {
    49  	return NewSilentWrapErrorf(ErrInvalidArgument, message, args...)
    50  }
    51  
    52  // NewPermissionDeniedErrorf returns an error that formats as the given text but unwraps as an ErrPermissionDenied
    53  func NewPermissionDeniedErrorf(message string, args ...interface{}) error {
    54  	return NewSilentWrapErrorf(ErrPermissionDenied, message, args...)
    55  }
    56  
    57  // NewAlreadyExistErrorf returns an error that formats as the given text but unwraps as an ErrAlreadyExist
    58  func NewAlreadyExistErrorf(message string, args ...interface{}) error {
    59  	return NewSilentWrapErrorf(ErrAlreadyExist, message, args...)
    60  }
    61  
    62  // NewNotExistErrorf returns an error that formats as the given text but unwraps as an ErrNotExist
    63  func NewNotExistErrorf(message string, args ...interface{}) error {
    64  	return NewSilentWrapErrorf(ErrNotExist, message, args...)
    65  }