1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
use std::fmt::Debug;
use std::fmt::Display;

use crate::log_id::RaftLogId;
use crate::LogId;
use crate::Membership;
use crate::Node;
use crate::NodeId;
use crate::OptionalSend;
use crate::OptionalSerde;
use crate::OptionalSync;

/// Defines operations on an entry payload.
pub trait RaftPayload<NID, N>
where
    N: Node,
    NID: NodeId,
{
    /// Return `true` if the entry payload is blank.
    fn is_blank(&self) -> bool;

    /// Return `Some(&Membership)` if the entry payload is a membership payload.
    fn get_membership(&self) -> Option<&Membership<NID, N>>;
}

/// Defines operations on an entry.
pub trait RaftEntry<NID, N>: RaftPayload<NID, N> + RaftLogId<NID>
where
    N: Node,
    NID: NodeId,
    Self: OptionalSerde + Debug + Display + OptionalSend + OptionalSync,
{
    /// Create a new blank log entry.
    ///
    /// The returned instance must return `true` for `Self::is_blank()`.
    fn new_blank(log_id: LogId<NID>) -> Self;

    /// Create a new membership log entry.
    ///
    /// The returned instance must return `Some()` for `Self::get_membership()`.
    fn new_membership(log_id: LogId<NID>, m: Membership<NID, N>) -> Self;
}

/// Build a raft log entry from app data.
///
/// A concrete Entry should implement this trait to let openraft create an entry when needed.
pub trait FromAppData<T> {
    /// Build a raft log entry from app data.
    fn from_app_data(t: T) -> Self;
}