#![doc = include_str!("../README.md")]
use std::error::Error;
use std::fmt::Display;
#[repr(u32)]
#[derive(Clone, Copy, Hash, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub enum RejectCode {
SysFatal = 1,
SysTransient = 2,
DestinationInvalid = 3,
CanisterReject = 4,
CanisterError = 5,
SysUnknown = 6,
Unrecognized(u32),
}
impl Display for RejectCode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
RejectCode::SysFatal => write!(f, "SysFatal(1)"),
RejectCode::SysTransient => write!(f, "SysTransient(2)"),
RejectCode::DestinationInvalid => write!(f, "DestinationInvalid(3)"),
RejectCode::CanisterReject => write!(f, "CanisterReject(4)"),
RejectCode::CanisterError => write!(f, "CanisterError(5)"),
RejectCode::SysUnknown => write!(f, "SysUnknown(6)"),
RejectCode::Unrecognized(code) => write!(f, "Unrecognized({})", code),
}
}
}
#[derive(Clone, Copy, Debug)]
pub struct ZeroIsInvalidRejectCode;
impl Display for ZeroIsInvalidRejectCode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "zero is invalid reject code")
}
}
impl Error for ZeroIsInvalidRejectCode {}
impl TryFrom<u32> for RejectCode {
type Error = ZeroIsInvalidRejectCode;
fn try_from(code: u32) -> Result<Self, Self::Error> {
match code {
0 => Err(ZeroIsInvalidRejectCode),
1 => Ok(RejectCode::SysFatal),
2 => Ok(RejectCode::SysTransient),
3 => Ok(RejectCode::DestinationInvalid),
4 => Ok(RejectCode::CanisterReject),
5 => Ok(RejectCode::CanisterError),
6 => Ok(RejectCode::SysUnknown),
_ => Ok(RejectCode::Unrecognized(code)),
}
}
}
impl From<RejectCode> for u32 {
fn from(code: RejectCode) -> u32 {
match code {
RejectCode::SysFatal => 1,
RejectCode::SysTransient => 2,
RejectCode::DestinationInvalid => 3,
RejectCode::CanisterReject => 4,
RejectCode::CanisterError => 5,
RejectCode::SysUnknown => 6,
RejectCode::Unrecognized(code) => code,
}
}
}
impl PartialEq<u32> for RejectCode {
fn eq(&self, other: &u32) -> bool {
let self_as_u32: u32 = (*self).into();
self_as_u32 == *other
}
}