use num_derive::FromPrimitive;
#[derive(Debug, Clone, Copy, Eq, PartialEq, FromPrimitive)]
pub enum StatusCode {
Success = 0,
ConvertIntError,
NoneStatusCode,
FatalError,
MisbehaveNode = 100,
BannedNode,
AddressOriginCheckError,
ProvideAddressError,
NoProvideAddress,
NoBlock,
NoProof,
NoTxHeight,
NoTxIndex,
NoTransaction,
NoBlockHeight,
NoBlockHash,
NoneProposal,
NoneBlockBody,
NoneBlockHeader,
NoneChainStatus,
NoneWitness,
NoneTransaction,
NoneUtxo,
NoneRawTx,
EarlyStatus,
ExecuteError,
EncodeError,
DecodeError,
NoCandidate,
NoEarlyStatus,
NoForkTree,
DupTransaction,
ProposalTooHigh,
ProposalTooLow,
ProposalCheckError,
ConsensusProposalCheckError,
BlockCheckError,
CSISigCheckError,
VersionOrIdCheckError,
HashCheckError,
HashLenError,
SigLenError,
SigCheckError,
NodeInSyncMode,
HistoryDupTx,
EmergencyBrake,
InvalidVersion,
InvalidTo,
InvalidNonce,
InvalidValidUntilBlock,
InvalidValue,
InvalidChainId,
InvalidWitness,
InvalidLockId,
InvalidPreHash,
AdminCheckError,
ModuleNotController,
QuotaUsedExceed,
NoStateRoot,
StateRootCheckError,
UpdateSystemConfigError,
ConsensusServerNotReady = 200,
ProposalProofError,
CryptoServerNotReady = 300,
NoneHashResult,
ConstructSigError,
ConstructKeyPairError,
SignError,
NetworkServerNotReady = 400,
SendMsgError,
BroadcastMsgError,
MultiAddrParseError,
DialNodeFail,
AddExistedPeer,
ExecuteServerNotReady = 500,
InternalChannelDisconnected,
ReenterBlock,
ReenterInvalidBlock,
StorageServerNotReady = 600,
NotFound,
InvalidRegion,
InvalidKey,
BadRegion,
StoreError,
LoadError,
DeleteError,
}
impl StatusCode {
pub fn is_success(&self) -> Result<(), StatusCode> {
if self != &StatusCode::Success {
Err(*self)
} else {
Ok(())
}
}
}
impl ::std::fmt::Display for StatusCode {
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
write!(f, "{:?}", self)
}
}
impl ::std::error::Error for StatusCode {}
macro_rules! impl_int_from_status {
($myty : ty) => {
impl From<StatusCode> for $myty {
fn from(v: StatusCode) -> Self {
v as $myty
}
}
};
}
impl_int_from_status!(u16);
impl_int_from_status!(u32);
impl_int_from_status!(u64);
impl_int_from_status!(u128);
macro_rules! impl_status_from_int {
($int_t : ty,$from_int :ident) => {
impl From<$int_t> for StatusCode {
fn from(v: $int_t) -> Self {
let s = num::FromPrimitive::$from_int(v);
s.unwrap_or(StatusCode::ConvertIntError)
}
}
};
}
impl_status_from_int!(u16, from_u16);
impl_status_from_int!(u32, from_u32);
impl_status_from_int!(u64, from_u64);
impl_status_from_int!(u128, from_u128);
impl From<cita_cloud_proto::common::StatusCode> for StatusCode {
fn from(status: cita_cloud_proto::common::StatusCode) -> Self {
StatusCode::from(status.code)
}
}
impl Into<cita_cloud_proto::common::StatusCode> for StatusCode {
fn into(self) -> cita_cloud_proto::common::StatusCode {
cita_cloud_proto::common::StatusCode { code: self.into() }
}
}
#[cfg(test)]
mod tests {
use crate::StatusCode;
#[test]
fn it_works() {
let num: u32 = StatusCode::BannedNode.into();
assert_eq!(num, 101);
let s = StatusCode::from(104 as u64);
assert_eq!(StatusCode::NoProvideAddress, s);
let s = StatusCode::from(65535 as u16);
assert_eq!(StatusCode::ConvertIntError, s);
let status = cita_cloud_proto::common::StatusCode { code: 0 };
let s = StatusCode::from(status);
assert_eq!(StatusCode::Success, s);
}
}