use std::fmt::Debug;
use std::fmt::Display;
use openraft_macros::since;
use crate::Membership;
use crate::base::OptionalFeatures;
use crate::base::finalized::Final;
use crate::entry::RaftPayload;
use crate::log_id::LogId;
use crate::vote::RaftCommittedLeaderId;
#[since(
version = "0.10.0",
change = "replaced `D`, `NodeId`, and `Node` associated types with `Payload`"
)]
#[since(
version = "0.10.0",
change = "moved membership inspection from `RaftPayload` to `RaftEntry`"
)]
#[since(
version = "0.10.0",
change = "removed `C: RaftTypeConfig` generic parameter, added associated types"
)]
pub trait RaftEntry
where Self: OptionalFeatures + Debug + Display
{
#[since(version = "0.10.0")]
type CommittedLeaderId: RaftCommittedLeaderId;
#[since(version = "0.10.0")]
type Payload: RaftPayload;
#[since(version = "0.10.0", change = "accept configured payload type")]
#[since(version = "0.10.0")]
fn new(log_id: LogId<Self::CommittedLeaderId>, payload: Self::Payload) -> Self;
#[since(version = "0.10.0")]
fn log_id_parts(&self) -> (&Self::CommittedLeaderId, u64);
#[since(version = "0.10.0", change = "use owned argument log id")]
fn set_log_id(&mut self, new: LogId<Self::CommittedLeaderId>);
#[since(version = "0.10.0", change = "derive membership type from `Payload`")]
#[since(version = "0.10.0")]
fn get_membership(
&self,
) -> Option<Membership<<Self::Payload as RaftPayload>::NodeId, <Self::Payload as RaftPayload>::Node>>;
#[since(version = "0.10.0", change = "construct configured payload type")]
#[since(version = "0.10.0", change = "become a default method")]
fn new_blank(log_id: LogId<Self::CommittedLeaderId>) -> Self
where Self: Final + Sized {
Self::new(log_id, Self::Payload::blank())
}
#[since(version = "0.10.0", change = "construct configured payload type")]
#[since(version = "0.10.0", change = "become a default method")]
fn new_normal(log_id: LogId<Self::CommittedLeaderId>, data: <Self::Payload as RaftPayload>::D) -> Self
where Self: Final + Sized {
Self::new(log_id, Self::Payload::normal(data))
}
#[since(version = "0.10.0", change = "construct configured payload type")]
#[since(version = "0.10.0", change = "become a default method")]
fn new_membership(
log_id: LogId<Self::CommittedLeaderId>,
m: Membership<<Self::Payload as RaftPayload>::NodeId, <Self::Payload as RaftPayload>::Node>,
) -> Self
where
Self: Final + Sized,
{
Self::new(log_id, Self::Payload::membership(m))
}
#[since(version = "0.10.0")]
fn log_id(&self) -> LogId<Self::CommittedLeaderId>
where Self: Final {
let (leader_id, index) = self.log_id_parts();
LogId::new(leader_id.clone(), index)
}
#[since(version = "0.10.0")]
fn index(&self) -> u64
where Self: Final {
self.log_id_parts().1
}
}