use core::time::Duration;
use crate::{Identity, Incarnation};
pub trait Runtime<T: Identity> {
fn notify(&mut self, notification: Notification<T>);
fn send_to(&mut self, to: T, data: &[u8]);
fn submit_after(&mut self, event: Timer<T>, after: Duration);
}
impl<T, R> Runtime<T> for &mut R
where
T: Identity,
R: Runtime<T>,
{
fn notify(&mut self, notification: Notification<T>) {
R::notify(self, notification)
}
fn send_to(&mut self, to: T, data: &[u8]) {
R::send_to(self, to, data)
}
fn submit_after(&mut self, event: Timer<T>, after: Duration) {
R::submit_after(self, event, after)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Notification<T> {
MemberUp(T),
MemberDown(T),
Active,
Idle,
Defunct,
Rejoin(T),
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Timer<T> {
ProbeRandomMember(TimerToken),
SendIndirectProbe {
probed_id: T,
token: TimerToken,
},
ChangeSuspectToDown {
member_id: T,
incarnation: Incarnation,
token: TimerToken,
},
RemoveDown(T),
PeriodicAnnounce(TimerToken),
PeriodicGossip(TimerToken),
}
pub type TimerToken = u8;