errors.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // Copyright 2014 Manu Martinez-Almeida. All rights reserved.
  2. // Use of this source code is governed by a MIT style
  3. // license that can be found in the LICENSE file.
  4. package gin
  5. import (
  6. "bytes"
  7. "fmt"
  8. )
  9. const (
  10. ErrorTypeBind = 1 << 31
  11. ErrorTypeRender = 1 << 30
  12. ErrorTypePrivate = 1 << 0
  13. ErrorTypePublic = 1 << 1
  14. ErrorTypeAny = 0xffffffff
  15. ErrorTypeNu = 2
  16. )
  17. // Used internally to collect errors that occurred during an http request.
  18. type errorMsg struct {
  19. Error error `json:"error"`
  20. Flags int `json:"-"`
  21. Metadata interface{} `json:"meta"`
  22. }
  23. func (msg *errorMsg) Type(flags int) *errorMsg {
  24. msg.Flags = flags
  25. return msg
  26. }
  27. func (msg *errorMsg) Meta(data interface{}) *errorMsg {
  28. msg.Metadata = data
  29. return msg
  30. }
  31. type errorMsgs []*errorMsg
  32. func (a errorMsgs) ByType(typ int) errorMsgs {
  33. if len(a) == 0 {
  34. return a
  35. }
  36. result := make(errorMsgs, 0, len(a))
  37. for _, msg := range a {
  38. if msg.Flags&typ > 0 {
  39. result = append(result, msg)
  40. }
  41. }
  42. return result
  43. }
  44. func (a errorMsgs) Errors() []string {
  45. if len(a) == 0 {
  46. return []string{}
  47. }
  48. errorStrings := make([]string, len(a))
  49. for i, err := range a {
  50. errorStrings[i] = err.Error.Error()
  51. }
  52. return errorStrings
  53. }
  54. func (a errorMsgs) String() string {
  55. if len(a) == 0 {
  56. return ""
  57. }
  58. var buffer bytes.Buffer
  59. for i, msg := range a {
  60. fmt.Fprintf(&buffer, "Error #%02d: %s\n Meta: %v\n", (i + 1), msg.Error, msg.Metadata)
  61. }
  62. return buffer.String()
  63. }