use std::fmt;
pub const STATUS_TRANSPORT: u32 = u32::MAX;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RpcError {
pub op_index: usize,
pub status: u32,
pub message: String,
}
impl RpcError {
pub fn op(op_index: usize, status: u32) -> RpcError {
RpcError {
op_index,
status,
message: String::new(),
}
}
pub fn transport(message: impl Into<String>) -> RpcError {
RpcError {
op_index: 0,
status: STATUS_TRANSPORT,
message: message.into(),
}
}
pub fn is_transport(&self) -> bool {
self.status == STATUS_TRANSPORT
}
}
impl fmt::Display for RpcError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if self.is_transport() {
write!(f, "transport error: {}", self.message)
} else {
write!(f, "op {} failed: status {}", self.op_index, self.status)
}
}
}
impl std::error::Error for RpcError {}
pub type RpcResult<T> = Result<T, RpcError>;