use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use super::error::MeshError;
use super::node::MeshNode;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum DiscoveryProtocol {
Mdns,
Gossip,
Registry,
Manual,
}
#[async_trait]
pub trait PeerDiscovery: Send + Sync {
async fn discover_peers(&self) -> Result<Vec<MeshNode>, MeshError>;
fn register_self(&mut self, node: MeshNode) -> Result<(), MeshError>;
fn deregister(&mut self) -> Result<(), MeshError>;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn discovery_protocol_equality() {
assert_eq!(DiscoveryProtocol::Mdns, DiscoveryProtocol::Mdns);
assert_eq!(DiscoveryProtocol::Gossip, DiscoveryProtocol::Gossip);
assert_eq!(DiscoveryProtocol::Registry, DiscoveryProtocol::Registry);
assert_eq!(DiscoveryProtocol::Manual, DiscoveryProtocol::Manual);
assert_ne!(DiscoveryProtocol::Mdns, DiscoveryProtocol::Gossip);
}
#[test]
fn discovery_protocol_serde_roundtrip() {
let variants = vec![
DiscoveryProtocol::Mdns,
DiscoveryProtocol::Gossip,
DiscoveryProtocol::Registry,
DiscoveryProtocol::Manual,
];
for variant in variants {
let json = serde_json::to_string(&variant).unwrap();
let deserialized: DiscoveryProtocol = serde_json::from_str(&json).unwrap();
assert_eq!(variant, deserialized);
}
}
#[test]
fn discovery_protocol_debug() {
assert!(format!("{:?}", DiscoveryProtocol::Mdns).contains("Mdns"));
assert!(format!("{:?}", DiscoveryProtocol::Gossip).contains("Gossip"));
}
#[test]
fn discovery_protocol_clone() {
let original = DiscoveryProtocol::Registry;
let cloned = original.clone();
assert_eq!(original, cloned);
}
#[test]
fn discovery_protocol_json_values() {
assert_eq!(
serde_json::to_string(&DiscoveryProtocol::Mdns).unwrap(),
"\"Mdns\""
);
assert_eq!(
serde_json::to_string(&DiscoveryProtocol::Manual).unwrap(),
"\"Manual\""
);
}
}