use std::fmt;
use display_more::DisplayOptionExt;
use crate::RaftTypeConfig;
use crate::type_config::alias::LogIdOf;
use crate::type_config::alias::VoteOf;
#[derive(Clone, Debug)]
#[derive(PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize), serde(bound = ""))]
pub struct TransferLeaderRequest<C>
where C: RaftTypeConfig
{
pub(crate) from_leader: VoteOf<C>,
pub(crate) to_node_id: C::NodeId,
pub(crate) last_log_id: Option<LogIdOf<C>>,
}
impl<C> TransferLeaderRequest<C>
where C: RaftTypeConfig
{
pub fn new(from: VoteOf<C>, to: C::NodeId, last_log_id: Option<LogIdOf<C>>) -> Self {
Self {
from_leader: from,
to_node_id: to,
last_log_id,
}
}
pub fn from_leader(&self) -> &VoteOf<C> {
&self.from_leader
}
pub fn to_node_id(&self) -> &C::NodeId {
&self.to_node_id
}
pub fn last_log_id(&self) -> Option<&LogIdOf<C>> {
self.last_log_id.as_ref()
}
}
impl<C> fmt::Display for TransferLeaderRequest<C>
where C: RaftTypeConfig
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"(from_leader={}, to={}, last_log_id={})",
self.from_leader,
self.to_node_id,
self.last_log_id.display()
)
}
}