errors.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. // Package errors is a drop-in replacement for Golang lib 'errors'.
  2. package errors
  3. import (
  4. "fmt"
  5. "v2ray.com/core/common/serial"
  6. )
  7. type hasInnerError interface {
  8. // Inner returns the underlying error of this one.
  9. Inner() error
  10. }
  11. type actionRequired interface {
  12. ActionRequired() bool
  13. }
  14. // Error is an error object with underlying error.
  15. type Error struct {
  16. message string
  17. inner error
  18. actionRequired bool
  19. }
  20. // Error implements error.Error().
  21. func (v Error) Error() string {
  22. return v.message
  23. }
  24. // Inner implements hasInnerError.Inner()
  25. func (v Error) Inner() error {
  26. if v.inner == nil {
  27. return nil
  28. }
  29. return v.inner
  30. }
  31. func (v Error) ActionRequired() bool {
  32. return v.actionRequired
  33. }
  34. func (v Error) RequireUserAction() Error {
  35. v.actionRequired = true
  36. return v
  37. }
  38. func (v Error) Message(msg ...interface{}) Error {
  39. return Error{
  40. inner: v,
  41. message: serial.Concat(msg...),
  42. }
  43. }
  44. func (v Error) Format(format string, values ...interface{}) Error {
  45. return v.Message(fmt.Sprintf(format, values...))
  46. }
  47. // New returns a new error object with message formed from given arguments.
  48. func New(msg ...interface{}) Error {
  49. return Error{
  50. message: serial.Concat(msg...),
  51. }
  52. }
  53. // Base returns an Error based on the given error.
  54. func Base(err error) Error {
  55. return Error{
  56. inner: err,
  57. }
  58. }
  59. func Format(format string, values ...interface{}) error {
  60. return New(fmt.Sprintf(format, values...))
  61. }
  62. // Cause returns the root cause of this error.
  63. func Cause(err error) error {
  64. if err == nil {
  65. return nil
  66. }
  67. for {
  68. inner, ok := err.(hasInnerError)
  69. if !ok || inner.Inner() == nil {
  70. break
  71. }
  72. err = inner.Inner()
  73. }
  74. return err
  75. }
  76. func IsActionRequired(err error) bool {
  77. for err != nil {
  78. if ar, ok := err.(actionRequired); ok && ar.ActionRequired() {
  79. return true
  80. }
  81. inner, ok := err.(hasInnerError)
  82. if !ok || inner.Inner() == nil {
  83. break
  84. }
  85. err = inner.Inner()
  86. }
  87. return false
  88. }