use std::fmt;
use openraft_macros::since;
use crate::vote::RaftCommittedLeaderId;
#[since(
version = "0.10.0",
change = "removed `C: RaftTypeConfig` generic parameter, added `CommittedLeaderId` associated type"
)]
pub trait RaftLogId
where Self: Eq + Clone + fmt::Debug
{
#[since(version = "0.10.0")]
type CommittedLeaderId: RaftCommittedLeaderId;
#[allow(dead_code)]
fn new(leader_id: Self::CommittedLeaderId, index: u64) -> Self;
fn committed_leader_id(&self) -> &Self::CommittedLeaderId;
fn index(&self) -> u64;
fn to_type<T>(&self) -> T
where T: RaftLogId<CommittedLeaderId = Self::CommittedLeaderId> {
T::new(self.committed_leader_id().clone(), self.index())
}
fn log_id_parts(&self) -> (&Self::CommittedLeaderId, u64) {
(self.committed_leader_id(), self.index())
}
}
impl<T> RaftLogId for &T
where T: RaftLogId
{
type CommittedLeaderId = T::CommittedLeaderId;
fn new(_leader_id: Self::CommittedLeaderId, _index: u64) -> Self {
unreachable!("This method should not be called on a reference.")
}
fn committed_leader_id(&self) -> &Self::CommittedLeaderId {
T::committed_leader_id(self)
}
fn index(&self) -> u64 {
T::index(self)
}
}