errors.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package metrics
  2. // ErrUnknownCode is a string code representing an unknown error
  3. // This will be used when no error code is sent by the handler
  4. const ErrUnknownCode = "PIT-000"
  5. // Error is an error with a code, message and metadata
  6. type Error struct {
  7. Code string
  8. Message string
  9. Metadata map[string]string
  10. }
  11. //NewError ctor
  12. func NewError(err error, code string, metadata ...map[string]string) *Error {
  13. if pitayaErr, ok := err.(*Error); ok {
  14. if len(metadata) > 0 {
  15. mergeMetadatas(pitayaErr, metadata[0])
  16. }
  17. return pitayaErr
  18. }
  19. e := &Error{
  20. Code: code,
  21. Message: err.Error(),
  22. }
  23. if len(metadata) > 0 {
  24. e.Metadata = metadata[0]
  25. }
  26. return e
  27. }
  28. func (e *Error) Error() string {
  29. return e.Message
  30. }
  31. func mergeMetadatas(pitayaErr *Error, metadata map[string]string) {
  32. if pitayaErr.Metadata == nil {
  33. pitayaErr.Metadata = metadata
  34. return
  35. }
  36. for key, value := range metadata {
  37. pitayaErr.Metadata[key] = value
  38. }
  39. }
  40. // CodeFromError returns the code of error.
  41. // If error is nil, return empty string.
  42. // If error is not a pitaya error, returns unkown code
  43. func CodeFromError(err error) string {
  44. if err == nil {
  45. return ""
  46. }
  47. pitayaErr, ok := err.(*Error)
  48. if !ok {
  49. return ErrUnknownCode
  50. }
  51. if pitayaErr == nil {
  52. return ""
  53. }
  54. return pitayaErr.Code
  55. }