result.txt 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package helpers
  2. // Result — аналог Result<T, E> из Rust
  3. //
  4. // Может быть либотолько полезное значение, либо только ошибка
  5. type Result[T any] struct {
  6. value T // Полезное значение
  7. err error // Ошибка
  8. }
  9. // NewResult -- возвращает успешный Result с значением
  10. func NewResult[T *any](result T) *Result[T] {
  11. Hassert(result != nil, "NewResult(): result==nil")
  12. return &Result[T]{
  13. value: result,
  14. }
  15. }
  16. // NewResultErr -- возвращает Result с ошибкой
  17. func NewResultErr[T any](err error) *Result[T] {
  18. Hassert(err != nil, "NewError(): err==nil")
  19. return &Result[T]{
  20. err: err,
  21. }
  22. }
  23. // IsOk -- возвращает true, если Result содержит значение
  24. func (sf *Result[T]) IsOk() bool {
  25. return sf.err == nil
  26. }
  27. // IsErr -- возвращает true, если Result содержит ошибку
  28. func (sf *Result[T]) IsErr() bool {
  29. return sf.err != nil
  30. }
  31. // Unwrap -- возвращает значение, если оно есть, иначе паникует
  32. func (sf *Result[T]) Unwrap() T {
  33. if sf.err != nil {
  34. panic(sf.err)
  35. }
  36. return sf.value
  37. }
  38. // UnwrapOr -- возвращает значение, если оно есть, или значение по умолчанию
  39. func (sf *Result[T]) UnwrapOr(defaultValue T) T {
  40. if sf.IsErr() {
  41. return defaultValue
  42. }
  43. return sf.value
  44. }
  45. // UnwrapOrElse -- возвращает значение, если оно есть, или результат выполнения функции
  46. func (sf *Result[T]) UnwrapOrElse(f func() T) T {
  47. if sf.IsErr() {
  48. return f()
  49. }
  50. return sf.value
  51. }
  52. // Error -- возвращает ошибку, если она есть
  53. func (sf *Result[T]) Error() error {
  54. return sf.err
  55. }
  56. // HAssert -- проверяет, что нет ошибки (с паникой)
  57. func (sf *Result[T]) Hassert(msg string) {
  58. Hassert(sf.err != nil, msg+", err=\n\t%v\n", sf.err)
  59. }
  60. // Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде)
  61. func (sf *Result[T]) Assert(msg string) {
  62. Assert(sf.err != nil, msg+", err=\n\t%v\n", sf.err)
  63. }