use std::fmt;
use std::sync::Arc;
use crate::RaftTypeConfig;
use crate::core::raft_msg::ExternalCommandName;
use crate::core::raft_msg::ResultSender;
use crate::errors::AllowNextRevertError;
use crate::metrics::MetricsRecorder;
use crate::type_config::alias::OneshotSenderOf;
use crate::type_config::alias::SnapshotOf;
pub(crate) enum ExternalCommand<C: RaftTypeConfig> {
Elect,
Heartbeat,
Snapshot,
GetSnapshot {
tx: OneshotSenderOf<C, Option<SnapshotOf<C>>>,
},
PurgeLog { upto: u64 },
TriggerTransferLeader { to: C::NodeId },
AllowNextRevert {
to: C::NodeId,
allow: bool,
tx: ResultSender<C, (), AllowNextRevertError<C>>,
},
SetMetricsRecorder { recorder: Option<Arc<dyn MetricsRecorder>> },
}
impl<C: RaftTypeConfig> ExternalCommand<C> {
pub fn name(&self) -> ExternalCommandName {
match self {
ExternalCommand::Elect => ExternalCommandName::Elect,
ExternalCommand::Heartbeat => ExternalCommandName::Heartbeat,
ExternalCommand::Snapshot => ExternalCommandName::Snapshot,
ExternalCommand::GetSnapshot { .. } => ExternalCommandName::GetSnapshot,
ExternalCommand::PurgeLog { .. } => ExternalCommandName::PurgeLog,
ExternalCommand::TriggerTransferLeader { .. } => ExternalCommandName::TriggerTransferLeader,
ExternalCommand::AllowNextRevert { .. } => ExternalCommandName::AllowNextRevert,
ExternalCommand::SetMetricsRecorder { .. } => ExternalCommandName::SetMetricsRecorder,
}
}
}
impl<C> fmt::Debug for ExternalCommand<C>
where C: RaftTypeConfig
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Display::fmt(self, f)
}
}
impl<C> fmt::Display for ExternalCommand<C>
where C: RaftTypeConfig
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ExternalCommand::Elect => {
write!(f, "Elect")
}
ExternalCommand::Heartbeat => {
write!(f, "Heartbeat")
}
ExternalCommand::Snapshot => {
write!(f, "Snapshot")
}
ExternalCommand::GetSnapshot { .. } => {
write!(f, "GetSnapshot")
}
ExternalCommand::PurgeLog { upto } => {
write!(f, "PurgeLog[..={}]", upto)
}
ExternalCommand::TriggerTransferLeader { to } => {
write!(f, "TriggerTransferLeader: to {}", to)
}
ExternalCommand::AllowNextRevert { to, allow, .. } => {
write!(
f,
"{}-on-next-log-revert: to {}",
if *allow { "AllowReset" } else { "Panic" },
to
)
}
ExternalCommand::SetMetricsRecorder { .. } => {
write!(f, "SetMetricsRecorder")
}
}
}
}