use std::fmt::Debug;
use std::fmt::Display;
use openraft_macros::since;
use crate::AppData;
use crate::EntryPayload;
use crate::Membership;
use crate::base::OptionalFeatures;
use crate::base::finalized::Final;
use crate::entry::RaftPayload;
use crate::log_id::LogId;
use crate::node::Node;
use crate::node::NodeId;
use crate::vote::RaftCommittedLeaderId;
#[since(
version = "0.10.0",
change = "removed `C: RaftTypeConfig` generic parameter, added associated types"
)]
pub trait RaftEntry
where
Self: OptionalFeatures + Debug + Display,
Self: RaftPayload<Self::NodeId, Self::Node>,
{
#[since(version = "0.10.0")]
type CommittedLeaderId: RaftCommittedLeaderId;
#[since(version = "0.10.0")]
type D: AppData;
#[since(version = "0.10.0")]
type NodeId: NodeId;
#[since(version = "0.10.0")]
type Node: Node;
#[since(version = "0.10.0")]
fn new(log_id: LogId<Self::CommittedLeaderId>, payload: EntryPayload<Self::D, Self::NodeId, Self::Node>) -> 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 = "become a default method")]
fn new_blank(log_id: LogId<Self::CommittedLeaderId>) -> Self
where Self: Final + Sized {
Self::new(log_id, EntryPayload::Blank)
}
#[since(version = "0.10.0", change = "become a default method")]
fn new_normal(log_id: LogId<Self::CommittedLeaderId>, data: Self::D) -> Self
where Self: Final + Sized {
Self::new(log_id, EntryPayload::Normal(data))
}
#[since(version = "0.10.0", change = "become a default method")]
fn new_membership(log_id: LogId<Self::CommittedLeaderId>, m: Membership<Self::NodeId, Self::Node>) -> Self
where Self: Final + Sized {
Self::new(log_id, EntryPayload::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
}
}