use nodedb_types::NodeId;
use serde::{Deserialize, Serialize};
use crate::swim::incarnation::Incarnation;
use crate::swim::member::record::MemberUpdate;
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Hash,
PartialOrd,
Ord,
Serialize,
Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub struct ProbeId(u64);
impl ProbeId {
pub const ZERO: ProbeId = ProbeId(0);
pub const fn new(v: u64) -> Self {
Self(v)
}
pub const fn get(self) -> u64 {
self.0
}
pub fn bump(self) -> Self {
ProbeId(self.0.saturating_add(1))
}
}
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Serialize,
Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub enum NackReason {
TargetUnreachable,
TargetDead,
RateLimited,
}
#[derive(
Debug,
Clone,
PartialEq,
Eq,
Serialize,
Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub struct Ping {
pub probe_id: ProbeId,
pub from: NodeId,
pub incarnation: Incarnation,
pub piggyback: Vec<MemberUpdate>,
}
#[derive(
Debug,
Clone,
PartialEq,
Eq,
Serialize,
Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub struct PingReq {
pub probe_id: ProbeId,
pub from: NodeId,
pub target: NodeId,
pub target_addr: String,
pub piggyback: Vec<MemberUpdate>,
}
#[derive(
Debug,
Clone,
PartialEq,
Eq,
Serialize,
Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub struct Ack {
pub probe_id: ProbeId,
pub from: NodeId,
pub incarnation: Incarnation,
pub piggyback: Vec<MemberUpdate>,
}
#[derive(
Debug,
Clone,
PartialEq,
Eq,
Serialize,
Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub struct Nack {
pub probe_id: ProbeId,
pub from: NodeId,
pub reason: NackReason,
pub piggyback: Vec<MemberUpdate>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn probe_id_bump_is_monotonic() {
assert_eq!(ProbeId::ZERO.bump(), ProbeId::new(1));
assert_eq!(ProbeId::new(42).bump(), ProbeId::new(43));
}
#[test]
fn probe_id_saturates_at_u64_max() {
let max = ProbeId::new(u64::MAX);
assert_eq!(max.bump(), max);
}
#[test]
fn probe_id_total_order() {
assert!(ProbeId::new(1) < ProbeId::new(2));
assert!(ProbeId::ZERO < ProbeId::new(1));
}
#[test]
fn nack_reason_equality() {
assert_eq!(NackReason::TargetDead, NackReason::TargetDead);
assert_ne!(NackReason::TargetDead, NackReason::RateLimited);
}
}