1use crate::jsonrpc;
2
3#[derive(thiserror::Error, Debug)]
4pub enum Error {
5 #[error("Rpc error {0}")]
6 Rpc(RpcError),
7 #[error("Decode error {0}")]
8 Decode(serde_json::Error),
9 #[error("Decode error {0}")]
10 Encode(serde_json::Error),
11 #[error("Connect error {0}")]
12 Connect(tokio_tungstenite::tungstenite::error::Error),
13 #[error("Request send error")]
14 ChannelSend,
15 #[error("Response send error {0}")]
16 ChannelRecv(#[from] tokio::sync::oneshot::error::RecvError),
17 #[error("Websocket error {0}")]
18 Websocket(#[from] tokio_tungstenite::tungstenite::Error),
19}
20
21
22#[derive(serde::Deserialize, Debug, Clone)]
23pub struct RpcError {
24 pub code: i64,
25 pub message: String,
26}
27
28impl std::fmt::Display for RpcError {
29 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
30 write!(
31 f,
32 "RpcError: {{\"code\": {}, \"message\": \"{}\"}}",
33 self.code, self.message
34 )
35 }
36}
37impl std::error::Error for RpcError {}
38
39impl From<jsonrpc::Error> for Error {
40 fn from(err: jsonrpc::Error) -> Self {
41 Error::Rpc(RpcError {
42 code: err.code,
43 message: err.message,
44 })
45 }
46}