mod log_id_option_ext;
mod log_index_option_ext;
pub(crate) mod option_raft_log_id_ext;
pub(crate) mod option_ref_log_id_ext;
pub(crate) mod raft_log_id;
pub(crate) mod raft_log_id_ext;
pub(crate) mod ref_log_id;
mod std_log_id;
use std::fmt::Display;
use std::fmt::Formatter;
pub use log_id_option_ext::LogIdOptionExt;
pub use log_index_option_ext::LogIndexOptionExt;
use openraft_macros::since;
pub use self::raft_log_id::RaftLogId;
use crate::vote::RaftCommittedLeaderId;
use crate::vote::RaftTerm;
use crate::vote::leader_id_std;
#[since(
version = "0.10.0",
change = "from `LogId<C: RaftTypeConfig>` to `LogId<CLID: RaftCommittedLeaderId>`"
)]
#[derive(Debug, Clone, PartialOrd, Ord, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize), serde(bound = ""))]
pub struct LogId<CLID>
where CLID: RaftCommittedLeaderId
{
pub leader_id: CLID,
pub index: u64,
}
impl<CLID> Copy for LogId<CLID> where CLID: RaftCommittedLeaderId + Copy {}
impl<CLID> RaftLogId for LogId<CLID>
where CLID: RaftCommittedLeaderId
{
type CommittedLeaderId = CLID;
fn new(leader_id: CLID, index: u64) -> Self {
LogId { leader_id, index }
}
fn committed_leader_id(&self) -> &CLID {
&self.leader_id
}
fn index(&self) -> u64 {
self.index
}
}
impl<CLID> Display for LogId<CLID>
where CLID: RaftCommittedLeaderId
{
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{}.{}", self.committed_leader_id(), self.index())
}
}
impl<CLID> LogId<CLID>
where CLID: RaftCommittedLeaderId
{
pub fn new(leader_id: CLID, index: u64) -> Self {
LogId { leader_id, index }
}
pub fn committed_leader_id(&self) -> &CLID {
&self.leader_id
}
#[deprecated(since = "0.10.0", note = "Use `committed_leader_id` instead.")]
pub fn leader_id(&self) -> &CLID {
&self.leader_id
}
pub fn index(&self) -> u64 {
self.index
}
}
impl<Term> LogId<leader_id_std::CommittedLeaderId<Term>>
where Term: RaftTerm
{
pub fn new_term_index(term: Term, index: u64) -> Self {
LogId {
leader_id: leader_id_std::CommittedLeaderId::new(term),
index,
}
}
}
#[cfg(test)]
mod tests {
use crate::log_id::raft_log_id::RaftLogId;
use crate::vote::leader_id_std;
type TestCLID = leader_id_std::CommittedLeaderId<u64>;
#[test]
fn test_new_term_index() {
let log_id = super::LogId::<TestCLID>::new_term_index(5, 100);
assert_eq!(100, log_id.index());
assert_eq!(5u64, **log_id.committed_leader_id());
}
#[test]
fn test_new_term_index_equivalence() {
let log_id1 = super::LogId::<TestCLID>::new_term_index(5, 100);
let log_id2 = super::LogId::<TestCLID>::new(TestCLID::new(5), 100);
assert_eq!(log_id1.index(), log_id2.index());
assert_eq!(**log_id1.committed_leader_id(), **log_id2.committed_leader_id());
}
#[test]
fn test_to_type_log_id_to_tuple() {
let log_id = super::LogId::<TestCLID>::new_term_index(5, 100);
let tuple: (u64, u64) = log_id.to_type();
assert_eq!((5, 100), tuple);
}
#[test]
fn test_to_type_tuple_to_log_id() {
let tuple: (u64, u64) = (5, 100);
let log_id: super::LogId<TestCLID> = tuple.to_type();
assert_eq!(100, log_id.index());
assert_eq!(5, **log_id.committed_leader_id());
}
#[test]
fn test_log_id_parts() {
let log_id = super::LogId::<TestCLID>::new_term_index(5, 100);
let (leader_id, index) = log_id.log_id_parts();
assert_eq!(5, **leader_id);
assert_eq!(100, index);
}
}