errorclass.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package errors
  2. import (
  3. "errors"
  4. "fmt"
  5. )
  6. type WTErrorClass interface {
  7. WTErrorClass_TAG()
  8. Code() string
  9. Msg() string
  10. New(...string) WTError
  11. Errorf(string, ...any) WTError
  12. Warp(error, string, ...any) WTError
  13. WarpQuick(error) WTError
  14. }
  15. type wtErrorClass struct {
  16. code string
  17. msg string
  18. base bool
  19. }
  20. func (c *wtErrorClass) WTErrorClass_TAG() {}
  21. func (c *wtErrorClass) Code() string {
  22. return c.code
  23. }
  24. func (c *wtErrorClass) Msg() string {
  25. return c.msg
  26. }
  27. func (c *wtErrorClass) New(msgList ...string) WTError {
  28. msg := c.msg
  29. if len(msgList) != 0 {
  30. msg = msgList[0]
  31. }
  32. code := c.code
  33. cause := error(nil)
  34. stack := getStack()
  35. return &wtError{
  36. class: c,
  37. cause: cause,
  38. msg: msg,
  39. code: code,
  40. stack: stack,
  41. }
  42. }
  43. func (c *wtErrorClass) Errorf(format string, a ...any) WTError {
  44. msg := fmt.Sprintf(format, a...)
  45. code := c.code
  46. cause := error(nil)
  47. stack := getStack()
  48. return &wtError{
  49. class: c,
  50. cause: cause,
  51. msg: msg,
  52. code: code,
  53. stack: stack,
  54. }
  55. }
  56. func (c *wtErrorClass) Warp(err error, format string, a ...any) WTError {
  57. if err == nil {
  58. return nil
  59. }
  60. msg := fmt.Sprintf(format, a...)
  61. code := c.code
  62. cause := err
  63. stack := ""
  64. var wtErr WTError
  65. if errors.As(err, &wtErr) {
  66. stack = wtErr.Stack()
  67. } else {
  68. stack = getStack()
  69. }
  70. return &wtError{
  71. class: c,
  72. cause: cause,
  73. msg: msg,
  74. code: code,
  75. stack: stack,
  76. }
  77. }
  78. func (c *wtErrorClass) WarpQuick(err error) WTError {
  79. if err == nil {
  80. return nil
  81. }
  82. var wtErr WTError
  83. if errors.As(err, &wtErr) && (c.base || wtErr.Code() == c.code) {
  84. return wtErr
  85. }
  86. msg := c.msg
  87. code := c.code
  88. cause := err
  89. stack := getStack()
  90. return &wtError{
  91. class: c,
  92. cause: cause,
  93. msg: msg,
  94. code: code,
  95. stack: stack,
  96. }
  97. }