use std::fmt::Debug;
use std::fmt::Display;
use openraft_macros::since;
use crate::AppData;
use crate::Membership;
use crate::base::OptionalFeatures;
use crate::node::Node;
use crate::node::NodeId;
#[since(
version = "0.10.0",
change = "replaced generic parameters with associated types and added construction methods"
)]
#[since(
version = "0.10.0",
change = "replaced `C: RaftTypeConfig` with `NID: NodeId, N: Node`"
)]
pub trait RaftPayload
where Self: OptionalFeatures + Debug + Display + Sized + 'static
{
#[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 blank() -> Self;
#[since(version = "0.10.0")]
fn with_normal(self, data: Self::D) -> Self;
#[since(version = "0.10.0")]
fn with_membership(self, membership: Membership<Self::NodeId, Self::Node>) -> Self;
#[since(version = "0.10.0", change = "use associated node types")]
fn get_membership(&self) -> Option<Membership<Self::NodeId, Self::Node>>;
#[since(version = "0.10.0")]
fn normal(data: Self::D) -> Self {
let payload = Self::blank();
payload.with_normal(data)
}
#[since(version = "0.10.0")]
fn membership(membership: Membership<Self::NodeId, Self::Node>) -> Self {
let payload = Self::blank();
payload.with_membership(membership)
}
}