github.com/xelaj/errs@v0.0.0-20200831133608-d1c11863e019/defs.go (about)

     1  package errs
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"strings"
     7  )
     8  
     9  // ArithmeticError // любая ошибка связанная с арифметикой
    10  // AssertionError // ошибка приведения типов
    11  // IndexError // индекс в слайсе не неайден
    12  // KeyError // ключ в мапе не найден
    13  // NameError
    14  // TypeError // когда в интерфейсе передан неправильный тип
    15  // InvalidTypeError
    16  // EnumError
    17  // NotUniqueError
    18  // TooManyParamsError
    19  // TooFewParamsError
    20  // ForbiddenError
    21  
    22  type NotImplementedError struct {
    23  	Name string
    24  }
    25  
    26  func NotImplemented(a ...string) *NotImplementedError {
    27  	return &NotImplementedError{strings.Join(a, "; ")}
    28  }
    29  
    30  func (e *NotImplementedError) Error() string {
    31  	r := "not implemented"
    32  	if e.Name != "" {
    33  		r = e.Name + ": " + r
    34  	}
    35  	return r
    36  }
    37  
    38  // RecursionError
    39  // RuntimeError
    40  // IOError
    41  // EnvironmentError // любая ошибка в конфигурации
    42  
    43  // что-то не существует
    44  type NotFoundError struct {
    45  	Type string
    46  	Key  string
    47  }
    48  
    49  func NotFound(_type, key string) *NotFoundError {
    50  	return &NotFoundError{_type, key}
    51  }
    52  
    53  func (err *NotFoundError) Error() string {
    54  	spacer := "'"
    55  	if err.Type != "" {
    56  		spacer = " '"
    57  	}
    58  	return err.Type + spacer + err.Key + "' not found"
    59  }
    60  
    61  func IsNotFound(err error) bool {
    62  	_, ok := err.(*NotFoundError)
    63  	return ok
    64  }
    65  
    66  type NotPointerError struct {
    67  	VariableName string
    68  }
    69  
    70  func NotPointer(varName string) *NotPointerError {
    71  	return &NotPointerError{varName}
    72  }
    73  
    74  func (err *NotPointerError) Error() string {
    75  	return err.VariableName + " is not a pointer"
    76  }
    77  
    78  // ошибка доступа. как к файлу, так и к чему либо другому
    79  type PermissionError struct {
    80  	Item          string
    81  	RequiredScope string
    82  }
    83  
    84  func Permission(item string) *PermissionError {
    85  	return &PermissionError{Item: item}
    86  }
    87  
    88  func (err *PermissionError) Scope(name string) *PermissionError {
    89  	err.RequiredScope = name
    90  	return err
    91  }
    92  
    93  func (err *PermissionError) Error() string {
    94  	res := err.Item + ": permission denied"
    95  	if err.RequiredScope != "" {
    96  		res += " (required " + err.RequiredScope + " scope)"
    97  	}
    98  	return res
    99  }
   100  
   101  func IsPermission(err error) bool {
   102  	_, ok := err.(*PermissionError)
   103  	return ok
   104  }
   105  
   106  // TimeoutError // таймаут, можно использовать вкупе с context
   107  
   108  // когда много ошибок, о которых надо сообщить
   109  type MultipleErrors struct {
   110  	errs []error
   111  }
   112  
   113  func Multiple(es ...error) *MultipleErrors {
   114  	return &MultipleErrors{es}
   115  }
   116  
   117  // DEPRECATED: use it only when you changing legacy code only
   118  func MultipleAsString(es ...string) *MultipleErrors {
   119  	res := make([]error, len(es))
   120  	for i, err := range es {
   121  		res[i] = errors.New(err)
   122  	}
   123  	return &MultipleErrors{res}
   124  }
   125  
   126  func (err *MultipleErrors) Add(errs ...error) {
   127  	if err.errs == nil {
   128  		err.errs = make([]error, 0)
   129  	}
   130  
   131  	for _, e := range errs {
   132  		if e == nil {
   133  			continue
   134  		}
   135  
   136  		err.errs = append(err.errs, e)
   137  	}
   138  }
   139  
   140  // приводит ошибку к общепризнаному виду
   141  func (err *MultipleErrors) Normalize() error {
   142  	switch len(err.errs) {
   143  	case 0:
   144  		return nil
   145  	case 1:
   146  		return err.errs[0]
   147  	default:
   148  		return err
   149  	}
   150  }
   151  
   152  func (err *MultipleErrors) Errors() []error {
   153  	return err.errs
   154  }
   155  
   156  func (err *MultipleErrors) Error() string {
   157  	switch len(err.errs) {
   158  	case 0:
   159  		return "(0 errors)"
   160  	case 1:
   161  		return err.errs[0].Error()
   162  	case 2:
   163  		return err.errs[0].Error() + " (and 1 other error)"
   164  	default:
   165  		return fmt.Sprintf("%s (and %d other errors)",
   166  			err.errs[0].Error(), len(err.errs)-1)
   167  	}
   168  }
   169  
   170  func IsMultiple(err error) bool {
   171  	_, ok := err.(*MultipleErrors)
   172  	return ok
   173  }