use serde::{Deserialize, Serialize};
use super::envelope::MessageEnvelope;
use super::error::NetworkError;
use crate::identity::AgentIdentity;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ConnectionState {
Disconnected,
Connecting,
Connected,
Reconnecting,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum TransportType {
Ipc,
Remote,
Tcp,
A2a,
PubSub,
Custom(String),
}
#[derive(Debug, Clone)]
pub enum NetworkEvent {
PeerJoined(AgentIdentity),
PeerLeft(uuid::Uuid),
MessageReceived(MessageEnvelope),
ConnectionStateChanged {
transport: TransportType,
state: ConnectionState,
},
Error(NetworkError),
}
#[cfg(test)]
mod tests {
use super::*;
use uuid::Uuid;
#[test]
fn connection_state_equality() {
assert_eq!(ConnectionState::Connected, ConnectionState::Connected);
assert_ne!(ConnectionState::Connected, ConnectionState::Disconnected);
}
#[test]
fn transport_type_equality() {
assert_eq!(TransportType::Ipc, TransportType::Ipc);
assert_ne!(TransportType::Ipc, TransportType::Tcp);
assert_eq!(
TransportType::Custom("nats".into()),
TransportType::Custom("nats".into())
);
}
#[test]
fn transport_type_serde_roundtrip() {
let types = vec![
TransportType::Ipc,
TransportType::Remote,
TransportType::Tcp,
TransportType::A2a,
TransportType::PubSub,
TransportType::Custom("redis".into()),
];
for t in types {
let json = serde_json::to_string(&t).unwrap();
let deserialized: TransportType = serde_json::from_str(&json).unwrap();
assert_eq!(deserialized, t);
}
}
#[test]
fn network_event_variants_constructible() {
let identity = AgentIdentity::new("test");
let _ = NetworkEvent::PeerJoined(identity);
let _ = NetworkEvent::PeerLeft(Uuid::new_v4());
let _ = NetworkEvent::ConnectionStateChanged {
transport: TransportType::Tcp,
state: ConnectionState::Connected,
};
let _ = NetworkEvent::Error(NetworkError::Timeout("5s".into()));
}
}