use openraft_macros::since;
use crate::NodeId;
use crate::Raft;
use crate::RaftTypeConfig;
use crate::impls::leader_id_std;
use crate::type_config::alias::CommittedLeaderIdOf;
use crate::type_config::alias::InstantOf;
use crate::type_config::alias::LeaderIdOf;
use crate::vote::RaftLeaderId;
use crate::vote::RaftTerm;
#[since(version = "0.10.0")]
pub struct Leader<C, SM = ()>
where C: RaftTypeConfig
{
pub(crate) raft: Raft<C, SM>,
pub(crate) leader_id: LeaderIdOf<C>,
pub(crate) last_quorum_acked: Option<InstantOf<C>>,
}
impl<C, SM> Clone for Leader<C, SM>
where C: RaftTypeConfig
{
fn clone(&self) -> Self {
Self {
raft: self.raft.clone(),
leader_id: self.leader_id.clone(),
last_quorum_acked: self.last_quorum_acked,
}
}
}
impl<C, SM> std::fmt::Debug for Leader<C, SM>
where C: RaftTypeConfig
{
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Leader")
.field("raft", &self.raft)
.field("leader_id", &self.leader_id)
.field("last_quorum_acked", &self.last_quorum_acked)
.finish()
}
}
impl<C, SM> Leader<C, SM>
where C: RaftTypeConfig
{
pub fn raft(&self) -> &Raft<C, SM> {
&self.raft
}
pub fn leader_id(&self) -> &LeaderIdOf<C> {
&self.leader_id
}
pub fn to_committed_leader_id(&self) -> CommittedLeaderIdOf<C> {
self.leader_id.to_committed()
}
pub fn last_quorum_acked(&self) -> Option<InstantOf<C>> {
self.last_quorum_acked
}
}
impl<Term, NID, C> Leader<C>
where
Term: RaftTerm,
NID: NodeId,
C: RaftTypeConfig<Term = Term, NodeId = NID, LeaderId = leader_id_std::LeaderId<Term, NID>>,
{
pub fn term(&self) -> C::Term {
self.leader_id.term()
}
}