near_jsonrpc_client/
errors.rs1use std::io;
3
4use thiserror::Error;
5
6use near_jsonrpc_primitives::errors::{RpcError, RpcErrorKind, RpcRequestValidationErrorKind};
7use near_jsonrpc_primitives::message::{self, Message};
8
9#[derive(Debug, Error)]
11pub enum JsonRpcTransportSendError {
12 #[error("error while serializing payload: [{0}]")]
14 PayloadSerializeError(io::Error),
15 #[error("error while sending payload: [{0}]")]
17 PayloadSendError(reqwest::Error),
18}
19
20#[derive(Debug, Error)]
22pub enum JsonRpcTransportHandlerResponseError {
23 #[error("error while parsing method call result: [{0}]")]
25 ResultParseError(serde_json::Error),
26 #[error("error while parsing method call error message: [{0}]")]
28 ErrorMessageParseError(serde_json::Error),
29}
30
31#[derive(Debug, Error)]
33pub enum JsonRpcTransportRecvError {
34 #[error("unexpected server response: [{0:?}]")]
36 UnexpectedServerResponse(Message),
37 #[error("error while reading response: [{0}]")]
39 PayloadRecvError(reqwest::Error),
40 #[error("error while parsing server response: [{0:?}]")]
42 PayloadParseError(message::Broken),
43 #[error(transparent)]
45 ResponseParseError(JsonRpcTransportHandlerResponseError),
46}
47
48#[derive(Debug, Error)]
50pub enum RpcTransportError {
51 #[error(transparent)]
53 SendError(JsonRpcTransportSendError),
54 #[error(transparent)]
56 RecvError(JsonRpcTransportRecvError),
57}
58
59#[derive(Debug, Error)]
61pub enum JsonRpcServerResponseStatusError {
62 #[error("this client is unauthorized")]
64 Unauthorized,
65 #[error("this client has exceeded the rate limit")]
67 TooManyRequests,
68 #[error("the server returned status code 400 - bad request")]
69 BadRequest,
70 #[error("the request failed with timeout error")]
71 TimeoutError,
72 #[error("the server is unavailable")]
73 ServiceUnavailable,
74 #[error("the server returned a non-OK (200) status code: [{status}]")]
76 Unexpected { status: reqwest::StatusCode },
77}
78
79#[derive(Debug, Error)]
81pub enum JsonRpcServerError<E> {
82 #[error("request validation error: [{0:?}]")]
84 RequestValidationError(RpcRequestValidationErrorKind),
85 #[error("handler error: [{0}]")]
87 HandlerError(E),
88 #[error("internal error: [{info:?}]")]
90 InternalError { info: Option<String> },
91 #[error("error response lacks context: {0}")]
93 NonContextualError(RpcError),
94 #[error(transparent)]
96 ResponseStatusError(JsonRpcServerResponseStatusError),
97}
98
99#[derive(Debug, Error)]
101pub enum JsonRpcError<E> {
102 #[error(transparent)]
104 TransportError(RpcTransportError),
105 #[error(transparent)]
107 ServerError(JsonRpcServerError<E>),
108}
109
110impl<E> JsonRpcError<E> {
111 pub fn handler_error(&self) -> Option<&E> {
112 if let Self::ServerError(JsonRpcServerError::HandlerError(err)) = self {
113 return Some(err);
114 }
115 None
116 }
117}
118
119impl<E: super::methods::RpcHandlerError> From<RpcError> for JsonRpcError<E> {
120 fn from(err: RpcError) -> Self {
121 let mut handler_parse_error = None;
122 match err.error_struct {
123 Some(RpcErrorKind::HandlerError(ref handler_error)) => {
124 match E::parse(*handler_error.clone()) {
125 Ok(handler_error) => {
126 return JsonRpcError::ServerError(JsonRpcServerError::HandlerError(
127 handler_error,
128 ))
129 }
130 Err(err) => {
131 handler_parse_error.replace(err);
132 }
133 }
134 }
135 Some(RpcErrorKind::RequestValidationError(err)) => {
136 return JsonRpcError::ServerError(JsonRpcServerError::RequestValidationError(err));
137 }
138 Some(RpcErrorKind::InternalError(err)) => {
139 return JsonRpcError::ServerError(JsonRpcServerError::InternalError {
140 info: err["info"]["error_message"]
141 .as_str()
142 .map(|info| info.to_string()),
143 })
144 }
145 None => {}
146 }
147 if let Some(ref raw_err_data) = err.data {
148 match E::parse_legacy_error(*raw_err_data.clone()) {
149 Some(Ok(handler_error)) => {
150 return JsonRpcError::ServerError(JsonRpcServerError::HandlerError(
151 handler_error,
152 ))
153 }
154 Some(Err(err)) => {
155 handler_parse_error.replace(err);
156 }
157 None => {}
158 }
159 }
160 if let Some(err) = handler_parse_error {
161 return JsonRpcError::TransportError(RpcTransportError::RecvError(
162 JsonRpcTransportRecvError::ResponseParseError(
163 JsonRpcTransportHandlerResponseError::ErrorMessageParseError(err),
164 ),
165 ));
166 }
167 JsonRpcError::ServerError(JsonRpcServerError::NonContextualError(err))
168 }
169}