zebra_rpc/server/
error.rs
1use jsonrpsee_types::{ErrorCode, ErrorObject, ErrorObjectOwned};
3
4#[derive(Default, Debug)]
12pub enum LegacyCode {
13 #[default]
16 Misc = -1,
17 ForbiddenBySafeMode = -2,
19 Type = -3,
21 InvalidAddressOrKey = -5,
23 OutOfMemory = -7,
25 InvalidParameter = -8,
27 Database = -20,
29 Deserialization = -22,
31 Verify = -25,
33 VerifyRejected = -26,
35 VerifyAlreadyInChain = -27,
37 InWarmup = -28,
39
40 ClientNotConnected = -9,
43 ClientInInitialDownload = -10,
45 ClientNodeAlreadyAdded = -23,
47 ClientNodeNotAdded = -24,
49 ClientNodeNotConnected = -29,
51 ClientInvalidIpOrSubnet = -30,
53}
54
55impl From<LegacyCode> for ErrorCode {
56 fn from(code: LegacyCode) -> Self {
57 Self::ServerError(code as i32)
58 }
59}
60
61impl From<LegacyCode> for i32 {
62 fn from(code: LegacyCode) -> Self {
63 code as i32
64 }
65}
66
67pub(crate) trait MapError<T>: Sized {
69 fn map_error(self, code: impl Into<ErrorCode>) -> std::result::Result<T, ErrorObjectOwned>;
71
72 fn map_error_with_prefix(
74 self,
75 code: impl Into<ErrorCode>,
76 msg_prefix: impl ToString,
77 ) -> Result<T, ErrorObjectOwned>;
78
79 fn map_misc_error(self) -> std::result::Result<T, ErrorObjectOwned> {
81 self.map_error(LegacyCode::Misc)
82 }
83}
84
85pub(crate) trait OkOrError<T>: Sized {
87 fn ok_or_error(
90 self,
91 code: impl Into<ErrorCode>,
92 message: impl ToString,
93 ) -> std::result::Result<T, ErrorObjectOwned>;
94
95 fn ok_or_misc_error(self, message: impl ToString) -> std::result::Result<T, ErrorObjectOwned> {
97 self.ok_or_error(LegacyCode::Misc, message)
98 }
99}
100
101impl<T, E> MapError<T> for Result<T, E>
102where
103 E: ToString,
104{
105 fn map_error(self, code: impl Into<ErrorCode>) -> Result<T, ErrorObjectOwned> {
106 self.map_err(|error| ErrorObject::owned(code.into().code(), error.to_string(), None::<()>))
107 }
108
109 fn map_error_with_prefix(
110 self,
111 code: impl Into<ErrorCode>,
112 msg_prefix: impl ToString,
113 ) -> Result<T, ErrorObjectOwned> {
114 self.map_err(|error| {
115 ErrorObject::owned(
116 code.into().code(),
117 format!("{}: {}", msg_prefix.to_string(), error.to_string()),
118 None::<()>,
119 )
120 })
121 }
122}
123
124impl<T> OkOrError<T> for Option<T> {
125 fn ok_or_error(
126 self,
127 code: impl Into<ErrorCode>,
128 message: impl ToString,
129 ) -> Result<T, ErrorObjectOwned> {
130 self.ok_or(ErrorObject::owned(
131 code.into().code(),
132 message.to_string(),
133 None::<()>,
134 ))
135 }
136}