use ckb_rust_std::io::Error as CoreIoError;
use ckb_std::error::SysError;
use core::fmt::{self, Debug, Display};
use enumn::N;
pub trait Error: Debug + Display {
fn source(&self) -> Option<&(dyn Error + 'static)> {
None
}
}
#[derive(Debug, Clone)]
pub enum IpcError {
CkbSysError(SysError),
UnexpectedEof,
IncompleteVlqSeq,
DecodeVlqOverflow,
ReadVlqError,
SerializeError,
DeserializeError,
SliceWriteError,
ReadUntilError,
ReadExactError,
BufReaderError,
GeneralIoError,
ProtocolError(ProtocolErrorCode),
}
impl Display for IpcError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{self:?}")
}
}
impl Error for IpcError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
None
}
}
impl From<CoreIoError> for IpcError {
fn from(_: CoreIoError) -> Self {
IpcError::GeneralIoError
}
}
#[derive(Debug, Clone, N)]
#[repr(u64)]
pub enum ProtocolErrorCode {
Ok = 0,
IndexOutOfBound = 1,
ItemMissing = 2,
LengthNotEnough = 3,
InvalidData = 4,
WaitFailure = 5,
InvalidFd = 6,
OtherEndClosed = 7,
MaxVmsSpawned = 8,
MaxFdsCreated = 9,
UnknownError = 20,
UnknownSysError = 21,
UnexpectedEof = 22,
IncompleteVlqSeq = 23,
DecodeVlqOverflow = 24,
ReadVlqError = 25,
SerializeError = 26,
DeserializeError = 27,
GeneralIoError = 28,
EndOfError = 29,
}
impl From<IpcError> for ProtocolErrorCode {
fn from(err: IpcError) -> Self {
match err {
IpcError::CkbSysError(err) => match err {
SysError::IndexOutOfBound => ProtocolErrorCode::IndexOutOfBound,
SysError::ItemMissing => ProtocolErrorCode::ItemMissing,
SysError::LengthNotEnough(_) => ProtocolErrorCode::LengthNotEnough,
SysError::Encoding => ProtocolErrorCode::InvalidData,
SysError::WaitFailure => ProtocolErrorCode::WaitFailure,
SysError::InvalidFd => ProtocolErrorCode::InvalidFd,
SysError::OtherEndClosed => ProtocolErrorCode::OtherEndClosed,
SysError::MaxVmsSpawned => ProtocolErrorCode::MaxVmsSpawned,
SysError::MaxFdsCreated => ProtocolErrorCode::MaxFdsCreated,
_ => ProtocolErrorCode::UnknownSysError,
},
IpcError::UnexpectedEof => ProtocolErrorCode::UnexpectedEof,
IpcError::IncompleteVlqSeq => ProtocolErrorCode::IncompleteVlqSeq,
IpcError::DecodeVlqOverflow => ProtocolErrorCode::DecodeVlqOverflow,
IpcError::ReadVlqError => ProtocolErrorCode::ReadVlqError,
IpcError::SerializeError => ProtocolErrorCode::SerializeError,
IpcError::DeserializeError => ProtocolErrorCode::DeserializeError,
IpcError::SliceWriteError
| IpcError::BufReaderError
| IpcError::ReadUntilError
| IpcError::ReadExactError => ProtocolErrorCode::GeneralIoError,
IpcError::GeneralIoError => ProtocolErrorCode::GeneralIoError,
IpcError::ProtocolError(e) => e,
}
}
}
impl From<u64> for ProtocolErrorCode {
fn from(e: u64) -> Self {
Self::n(e).unwrap()
}
}