use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)]
pub enum RejectCode {
SysFatal = 1,
SysTransient = 2,
DestinationInvalid = 3,
CanisterReject = 4,
CanisterError = 5,
SysUnknown = 6,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct UnknownRejectCode(pub u64);
impl TryFrom<u64> for RejectCode {
type Error = UnknownRejectCode;
fn try_from(code: u64) -> Result<Self, Self::Error> {
match code {
1 => Ok(Self::SysFatal),
2 => Ok(Self::SysTransient),
3 => Ok(Self::DestinationInvalid),
4 => Ok(Self::CanisterReject),
5 => Ok(Self::CanisterError),
6 => Ok(Self::SysUnknown),
_ => Err(UnknownRejectCode(code)),
}
}
}
impl std::fmt::Display for RejectCode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(match self {
Self::SysFatal => "SYS_FATAL",
Self::SysTransient => "SYS_TRANSIENT",
Self::DestinationInvalid => "DESTINATION_INVALID",
Self::CanisterReject => "CANISTER_REJECT",
Self::CanisterError => "CANISTER_ERROR",
Self::SysUnknown => "SYS_UNKNOWN",
})
}
}
#[cfg(test)]
mod tests;