use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(transparent)]
pub struct PeerCorrelationId(#[cfg_attr(feature = "schema", schemars(with = "String"))] pub Uuid);
impl PeerCorrelationId {
pub fn new() -> Self {
Self(Uuid::new_v4())
}
pub fn from_uuid(uuid: Uuid) -> Self {
Self(uuid)
}
pub fn as_uuid(&self) -> Uuid {
self.0
}
}
impl Default for PeerCorrelationId {
fn default() -> Self {
Self::new()
}
}
impl std::fmt::Display for PeerCorrelationId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.0.fmt(f)
}
}
impl From<Uuid> for PeerCorrelationId {
fn from(uuid: Uuid) -> Self {
Self(uuid)
}
}
impl From<PeerCorrelationId> for Uuid {
fn from(id: PeerCorrelationId) -> Self {
id.0
}
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default, Serialize, Deserialize,
)]
#[non_exhaustive]
pub enum OutboundPeerRequestState {
#[default]
Sent,
AcceptedProgress,
Completed,
Failed,
TimedOut,
}
impl OutboundPeerRequestState {
pub fn is_terminal(self) -> bool {
matches!(self, Self::Completed | Self::Failed | Self::TimedOut)
}
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default, Serialize, Deserialize,
)]
#[non_exhaustive]
pub enum InboundPeerRequestState {
#[default]
Received,
Replied,
}
impl InboundPeerRequestState {
pub fn is_terminal(self) -> bool {
matches!(self, Self::Replied)
}
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default, Serialize, Deserialize,
)]
#[non_exhaustive]
pub enum InteractionStreamState {
#[default]
Reserved,
Attached,
Completed,
Expired,
ClosedEarly,
}
impl InteractionStreamState {
pub fn is_terminal(self) -> bool {
matches!(self, Self::Completed | Self::Expired | Self::ClosedEarly)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn corr_id_roundtrip_via_uuid() {
let id = PeerCorrelationId::new();
let raw: Uuid = id.into();
assert_eq!(PeerCorrelationId::from(raw), id);
assert_eq!(PeerCorrelationId::from_uuid(raw), id);
assert_eq!(id.as_uuid(), raw);
}
#[test]
fn outbound_terminality_covers_every_terminal_variant() {
assert!(!OutboundPeerRequestState::Sent.is_terminal());
assert!(!OutboundPeerRequestState::AcceptedProgress.is_terminal());
assert!(OutboundPeerRequestState::Completed.is_terminal());
assert!(OutboundPeerRequestState::Failed.is_terminal());
assert!(OutboundPeerRequestState::TimedOut.is_terminal());
}
#[test]
fn inbound_terminality_is_replied_only() {
assert!(!InboundPeerRequestState::Received.is_terminal());
assert!(InboundPeerRequestState::Replied.is_terminal());
}
}