use crate::RaftTypeConfig;
use crate::core::raft_msg::external_command::ExternalCommand;
use crate::errors::AllowNextRevertError;
use crate::errors::Fatal;
use crate::raft::RaftInner;
use crate::type_config::TypeConfigExt;
pub struct Trigger<'r, C>
where C: RaftTypeConfig
{
raft_inner: &'r RaftInner<C>,
}
impl<'r, C> Trigger<'r, C>
where C: RaftTypeConfig
{
pub(in crate::raft) fn new(raft_inner: &'r RaftInner<C>) -> Self {
Self { raft_inner }
}
pub async fn elect(&self) -> Result<(), Fatal<C>> {
self.raft_inner.send_external_command(ExternalCommand::Elect).await
}
pub async fn heartbeat(&self) -> Result<(), Fatal<C>> {
self.raft_inner.send_external_command(ExternalCommand::Heartbeat).await
}
pub async fn snapshot(&self) -> Result<(), Fatal<C>> {
self.raft_inner.send_external_command(ExternalCommand::Snapshot).await
}
pub async fn purge_log(&self, upto: u64) -> Result<(), Fatal<C>> {
self.raft_inner.send_external_command(ExternalCommand::PurgeLog { upto }).await
}
pub async fn transfer_leader(&self, to: C::NodeId) -> Result<(), Fatal<C>> {
self.raft_inner.send_external_command(ExternalCommand::TriggerTransferLeader { to }).await
}
pub async fn allow_next_revert(
&self,
to: &C::NodeId,
allow: bool,
) -> Result<Result<(), AllowNextRevertError<C>>, Fatal<C>> {
let (tx, rx) = C::oneshot();
self.raft_inner
.send_external_command(ExternalCommand::AllowNextRevert {
to: to.clone(),
allow,
tx,
})
.await?;
let res: Result<(), AllowNextRevertError<C>> = self.raft_inner.recv_msg(rx).await?;
Ok(res)
}
}