1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
use crate::rpc::error::Error as RPCError;
use derive_more::{Display, From};
use serde_json::Error as SerdeError;
use std::io::Error as IoError;
pub type Result<T = ()> = std::result::Result<T, Error>;
#[derive(Debug, Display, From)]
pub enum Error {
#[display(fmt = "Server is unreachable")]
Unreachable,
#[display(fmt = "Decoder error: {}", _0)]
Decoder(String),
#[display(fmt = "Got invalid response: {}", _0)]
#[from(ignore)]
InvalidResponse(String),
#[display(fmt = "Transport error: {}", _0)]
#[from(ignore)]
Transport(String),
#[display(fmt = "RPC error: {:?}", _0)]
Rpc(RPCError),
#[display(fmt = "IO error: {}", _0)]
Io(IoError),
#[display(fmt = "Recovery error: {}", _0)]
Recovery(crate::signing::RecoveryError),
#[display(fmt = "Internal Web3 error")]
Internal,
}
impl std::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
use self::Error::*;
match *self {
Unreachable | Decoder(_) | InvalidResponse(_) | Transport(_) | Internal => None,
Rpc(ref e) => Some(e),
Io(ref e) => Some(e),
Recovery(ref e) => Some(e),
}
}
}
impl From<SerdeError> for Error {
fn from(err: SerdeError) -> Self {
Error::Decoder(format!("{:?}", err))
}
}
impl Clone for Error {
fn clone(&self) -> Self {
use self::Error::*;
match self {
Unreachable => Unreachable,
Decoder(s) => Decoder(s.clone()),
InvalidResponse(s) => InvalidResponse(s.clone()),
Transport(s) => Transport(s.clone()),
Rpc(e) => Rpc(e.clone()),
Io(e) => Io(IoError::from(e.kind())),
Recovery(e) => Recovery(e.clone()),
Internal => Internal,
}
}
}
#[cfg(test)]
impl PartialEq for Error {
fn eq(&self, other: &Self) -> bool {
use self::Error::*;
match (self, other) {
(Unreachable, Unreachable) | (Internal, Internal) => true,
(Decoder(a), Decoder(b)) | (InvalidResponse(a), InvalidResponse(b)) | (Transport(a), Transport(b)) => {
a == b
}
(Rpc(a), Rpc(b)) => a == b,
(Io(a), Io(b)) => a.kind() == b.kind(),
(Recovery(a), Recovery(b)) => a == b,
_ => false,
}
}
}