use jsonrpsee_types::{ErrorCode, ErrorObject, ErrorObjectOwned};
#[derive(Default, Debug)]
pub enum LegacyCode {
#[default]
Misc = -1,
ForbiddenBySafeMode = -2,
Type = -3,
InvalidAddressOrKey = -5,
OutOfMemory = -7,
InvalidParameter = -8,
Database = -20,
Deserialization = -22,
Verify = -25,
VerifyRejected = -26,
VerifyAlreadyInChain = -27,
InWarmup = -28,
ClientNotConnected = -9,
ClientInInitialDownload = -10,
ClientNodeAlreadyAdded = -23,
ClientNodeNotAdded = -24,
ClientNodeNotConnected = -29,
ClientInvalidIpOrSubnet = -30,
}
impl From<LegacyCode> for ErrorCode {
fn from(code: LegacyCode) -> Self {
Self::ServerError(code as i32)
}
}
impl From<LegacyCode> for i32 {
fn from(code: LegacyCode) -> Self {
code as i32
}
}
pub(crate) trait MapError<T>: Sized {
fn map_error(self, code: impl Into<ErrorCode>) -> std::result::Result<T, ErrorObjectOwned>;
fn map_error_with_prefix(
self,
code: impl Into<ErrorCode>,
msg_prefix: impl ToString,
) -> Result<T, ErrorObjectOwned>;
fn map_misc_error(self) -> std::result::Result<T, ErrorObjectOwned> {
self.map_error(LegacyCode::Misc)
}
}
pub(crate) trait OkOrError<T>: Sized {
fn ok_or_error(
self,
code: impl Into<ErrorCode>,
message: impl ToString,
) -> std::result::Result<T, ErrorObjectOwned>;
fn ok_or_misc_error(self, message: impl ToString) -> std::result::Result<T, ErrorObjectOwned> {
self.ok_or_error(LegacyCode::Misc, message)
}
}
impl<T, E> MapError<T> for Result<T, E>
where
E: ToString,
{
fn map_error(self, code: impl Into<ErrorCode>) -> Result<T, ErrorObjectOwned> {
self.map_err(|error| ErrorObject::owned(code.into().code(), error.to_string(), None::<()>))
}
fn map_error_with_prefix(
self,
code: impl Into<ErrorCode>,
msg_prefix: impl ToString,
) -> Result<T, ErrorObjectOwned> {
self.map_err(|error| {
ErrorObject::owned(
code.into().code(),
format!("{}: {}", msg_prefix.to_string(), error.to_string()),
None::<()>,
)
})
}
}
impl<T> OkOrError<T> for Option<T> {
fn ok_or_error(
self,
code: impl Into<ErrorCode>,
message: impl ToString,
) -> Result<T, ErrorObjectOwned> {
self.ok_or(ErrorObject::owned(
code.into().code(),
message.to_string(),
None::<()>,
))
}
}