kresult.go 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package kresult
  2. import (
  3. "reflect"
  4. . "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
  5. )
  6. // Result — аналог Result<T, E> из Rust
  7. //
  8. // Может быть либо только полезное значение, либо только ошибка
  9. type Result[T any] struct {
  10. val T // Полезное значение
  11. err error // Ошибка
  12. }
  13. // NewOk -- возвращает успешный Result с значением
  14. func NewOk[T any](result T) *Result[T] {
  15. // Для некоторых типов нужна дополнительная проверка через reflect
  16. v := reflect.ValueOf(result)
  17. switch v.Kind() {
  18. case reflect.Ptr, reflect.Slice, reflect.Map, reflect.Chan, reflect.Func, reflect.Interface:
  19. Hassert(!v.IsNil(), "NewOk(): result==nil")
  20. }
  21. sf := &Result[T]{
  22. val: result,
  23. }
  24. return sf
  25. }
  26. // NewErr -- возвращает Result с ошибкой
  27. func NewErr(err error) *Result[any] {
  28. Hassert(err != nil, "NewError(): err==nil")
  29. return &Result[any]{
  30. err: err,
  31. }
  32. }
  33. // IsOk -- возвращает true, если Result содержит значение
  34. func (sf *Result[T]) IsOk() bool {
  35. return sf.err == nil
  36. }
  37. // IsErr -- возвращает true, если Result содержит ошибку
  38. func (sf *Result[T]) IsErr() bool {
  39. return sf.err != nil
  40. }
  41. // Unwrap -- возвращает значение, если оно есть, иначе паникует
  42. func (sf *Result[T]) Unwrap() T {
  43. Hassert(sf.err == nil, "Result[T].Unwrap(): err(%v)!=nil", sf.err)
  44. return sf.val
  45. }
  46. // UnwrapOr -- возвращает значение, если оно есть, или значение по умолчанию
  47. func (sf *Result[T]) UnwrapOr(defaultValue T) T {
  48. if sf.err != nil {
  49. return defaultValue
  50. }
  51. return sf.val
  52. }
  53. // UnwrapOrFn -- возвращает значение, если оно есть, или результат выполнения функции
  54. func (sf *Result[T]) UnwrapOrFn(fn func() T) T {
  55. Hassert(fn != nil, "Result[T].UnwrapOrFn(): fn==nil")
  56. if sf.err != nil {
  57. return fn()
  58. }
  59. return sf.val
  60. }
  61. // Error -- возвращает ошибку, если она есть
  62. func (sf *Result[T]) Error() error {
  63. return sf.err
  64. }
  65. // Hassert -- проверяет, что нет ошибки (с паникой)
  66. func (sf *Result[T]) Hassert(msg string) {
  67. Hassert(sf.err == nil, msg+", err=\n\t%v\n", sf.err)
  68. }
  69. // Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде)
  70. func (sf *Result[T]) Assert(msg string) {
  71. Assert(sf.err == nil, msg+", err=\n\t%v\n", sf.err)
  72. }