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 }