|
@@ -11,8 +11,9 @@ import (
|
|
|
//
|
|
//
|
|
|
// Может быть либо только полезное значение, либо только ошибка
|
|
// Может быть либо только полезное значение, либо только ошибка
|
|
|
type Result[T any] struct {
|
|
type Result[T any] struct {
|
|
|
- val T // Полезное значение
|
|
|
|
|
- err error // Ошибка
|
|
|
|
|
|
|
+ val T // Полезное значение
|
|
|
|
|
+ isErr bool
|
|
|
|
|
+ err error // Ошибка
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// NewOk -- возвращает успешный Result с значением
|
|
// NewOk -- возвращает успешный Result с значением
|
|
@@ -33,56 +34,74 @@ func NewOk[T any](result T) Result[T] {
|
|
|
func NewErr[T any](err error) Result[T] {
|
|
func NewErr[T any](err error) Result[T] {
|
|
|
Hassert(err != nil, "NewError(): err==nil")
|
|
Hassert(err != nil, "NewError(): err==nil")
|
|
|
return Result[T]{
|
|
return Result[T]{
|
|
|
- err: err,
|
|
|
|
|
|
|
+ err: err,
|
|
|
|
|
+ isErr: true,
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// WrapErr -- оборачивает существующий Result с ошибкой с новой ошибкой
|
|
|
|
|
+func WrapErr[T any](res Result[T], err error) Result[T] {
|
|
|
|
|
+ Hassert(res.IsErr(), "WrapErr(): result not have error")
|
|
|
|
|
+ Hassert(err != nil, "WrapErr(): err==nil")
|
|
|
|
|
+ err0 := res.Err()
|
|
|
|
|
+ err = fmt.Errorf("%v, err=\n\t%w", err0, err)
|
|
|
|
|
+ res0 := NewErr[T](err)
|
|
|
|
|
+ return res0
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// IsOk -- возвращает true, если Result содержит значение
|
|
// IsOk -- возвращает true, если Result содержит значение
|
|
|
func (sf *Result[T]) IsOk() bool {
|
|
func (sf *Result[T]) IsOk() bool {
|
|
|
- return sf.err == nil
|
|
|
|
|
|
|
+ return !sf.isErr
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// IsErr -- возвращает true, если Result содержит ошибку
|
|
// IsErr -- возвращает true, если Result содержит ошибку
|
|
|
func (sf *Result[T]) IsErr() bool {
|
|
func (sf *Result[T]) IsErr() bool {
|
|
|
- return sf.err != nil
|
|
|
|
|
|
|
+ return sf.isErr
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// Unwrap -- возвращает значение, если оно есть, иначе паникует
|
|
|
|
|
-func (sf *Result[T]) Unwrap() T {
|
|
|
|
|
- Hassert(sf.err == nil, "Result[T].Unwrap(): err(%v)!=nil", sf.err)
|
|
|
|
|
|
|
+// Val -- возвращает значение, если оно есть, иначе паникует
|
|
|
|
|
+func (sf *Result[T]) Val() T {
|
|
|
|
|
+ Hassert(!sf.isErr, "Result[T].Val(): err(%v)!=nil", sf.err)
|
|
|
return sf.val
|
|
return sf.val
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// UnwrapOr -- возвращает значение, если оно есть, или значение по умолчанию
|
|
|
|
|
-func (sf *Result[T]) UnwrapOr(defaultValue T) T {
|
|
|
|
|
- if sf.err != nil {
|
|
|
|
|
|
|
+// ValOr -- возвращает значение, если оно есть, или значение по умолчанию
|
|
|
|
|
+func (sf *Result[T]) ValOr(defaultValue T) T {
|
|
|
|
|
+ if sf.isErr {
|
|
|
return defaultValue
|
|
return defaultValue
|
|
|
}
|
|
}
|
|
|
return sf.val
|
|
return sf.val
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// UnwrapOrFn -- возвращает значение, если оно есть, или результат выполнения функции
|
|
|
|
|
-func (sf *Result[T]) UnwrapOrFn(fn func() T) T {
|
|
|
|
|
- Hassert(fn != nil, "Result[T].UnwrapOrFn(): fn==nil")
|
|
|
|
|
- if sf.err != nil {
|
|
|
|
|
|
|
+// ValOrFn -- возвращает значение, если оно есть, или результат выполнения функции
|
|
|
|
|
+func (sf *Result[T]) ValOrFn(fn func() T) T {
|
|
|
|
|
+ Hassert(fn != nil, "Result[T].ValOrFn(): fn==nil")
|
|
|
|
|
+ if sf.isErr {
|
|
|
return fn()
|
|
return fn()
|
|
|
}
|
|
}
|
|
|
return sf.val
|
|
return sf.val
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// Error -- возвращает ошибку, если она есть
|
|
|
|
|
-func (sf *Result[T]) Error() error {
|
|
|
|
|
|
|
+// Err -- возвращает ошибку, если она есть
|
|
|
|
|
+func (sf *Result[T]) Err() error {
|
|
|
|
|
+ Hassert(sf.isErr, "Result[T].Err(): err==nil")
|
|
|
return sf.err
|
|
return sf.err
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// Error -- возвращает строковое представление ошибки, если она есть
|
|
|
|
|
+func (sf *Result[T]) Error() string {
|
|
|
|
|
+ Hassert(sf.isErr, "Result[T].Error(): err==nil")
|
|
|
|
|
+ return sf.err.Error()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// Hassert -- проверяет, что нет ошибки (с паникой)
|
|
// Hassert -- проверяет, что нет ошибки (с паникой)
|
|
|
func (sf *Result[T]) Hassert(msgFormat string, args ...any) {
|
|
func (sf *Result[T]) Hassert(msgFormat string, args ...any) {
|
|
|
msg := fmt.Sprintf(msgFormat, args...)
|
|
msg := fmt.Sprintf(msgFormat, args...)
|
|
|
- Hassert(sf.err == nil, msg+", err=\n\t%v\n", sf.err)
|
|
|
|
|
|
|
+ Hassert(!sf.isErr, msg+", err=\n\t%v\n", sf.err)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде)
|
|
// Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде)
|
|
|
func (sf *Result[T]) Assert(msgFormat string, args ...any) {
|
|
func (sf *Result[T]) Assert(msgFormat string, args ...any) {
|
|
|
msg := fmt.Sprintf(msgFormat, args...)
|
|
msg := fmt.Sprintf(msgFormat, args...)
|
|
|
- Assert(sf.err == nil, msg+", err=\n\t%v\n", sf.err)
|
|
|
|
|
|
|
+ Assert(!sf.isErr, msg+", err=\n\t%v\n", sf.err)
|
|
|
}
|
|
}
|