kresult.go 2.7 KB

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