errors.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package jsonrpc2
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. )
  6. var (
  7. errServerError = NewError(-1, "Error: json.Marshal failed")
  8. )
  9. // Error represent JSON-RPC 2.0 "Error object".
  10. type Error struct {
  11. Code int `json:"code"`
  12. Message string `json:"message"`
  13. }
  14. // NewError returns an Error with given code and message.
  15. func NewError(code int, message string) *Error {
  16. return &Error{Code: code, Message: message}
  17. }
  18. // NewError returns an Error with given code and message.
  19. func NewJsonError(code int, message string) error {
  20. e := &Error{Code: code, Message: message}
  21. buf, err := json.Marshal(e)
  22. if err != nil {
  23. msg, err := json.Marshal(err.Error())
  24. if err != nil {
  25. msg = []byte(`"` + errServerError.Message + `"`)
  26. }
  27. return fmt.Errorf(`{"code":%d,"message":%s}`, errServerError.Code, string(msg))
  28. }
  29. return fmt.Errorf(string(buf))
  30. }
  31. // Error returns JSON representation of Error.
  32. func (e *Error) Error() string {
  33. buf, err := json.Marshal(e)
  34. if err != nil {
  35. msg, err := json.Marshal(err.Error())
  36. if err != nil {
  37. msg = []byte(`"` + errServerError.Message + `"`)
  38. }
  39. return fmt.Sprintf(`{"code":%d,"message":%s}`, errServerError.Code, string(msg))
  40. }
  41. return string(buf)
  42. }