result.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. // Copyright (c) Tailscale Inc & AUTHORS
  2. // SPDX-License-Identifier: BSD-3-Clause
  3. // Package result contains the Of result type, which is
  4. // either a value or an error.
  5. package result
  6. // Of is either a T value or an error.
  7. //
  8. // Think of it like Rust or Swift's result types.
  9. // It's named "Of" because the fully qualified name
  10. // for callers reads result.Of[T].
  11. type Of[T any] struct {
  12. v T // valid if Err is nil; invalid if Err is non-nil
  13. err error
  14. }
  15. // Value returns a new result with value v,
  16. // without an error.
  17. func Value[T any](v T) Of[T] {
  18. return Of[T]{v: v}
  19. }
  20. // Error returns a new result with error err.
  21. // If err is nil, the returned result is equivalent
  22. // to calling Value with T's zero value.
  23. func Error[T any](err error) Of[T] {
  24. return Of[T]{err: err}
  25. }
  26. // MustValue returns r's result value.
  27. // It panics if r.Err returns non-nil.
  28. func (r Of[T]) MustValue() T {
  29. if r.err != nil {
  30. panic(r.err)
  31. }
  32. return r.v
  33. }
  34. // Value returns r's result value and error.
  35. func (r Of[T]) Value() (T, error) {
  36. return r.v, r.err
  37. }
  38. // Err returns r's error, if any.
  39. // When r.Err returns nil, it's safe to call r.MustValue without it panicking.
  40. func (r Of[T]) Err() error {
  41. return r.err
  42. }