pub mod error;
pub mod mdns;
pub mod types;
pub use error::{HiveDiscoError, Result};
pub use types::{
DiscoveryEvent, DiscoveryServiceDetails, DiscoveryServiceStatus, LocalServiceConfig,
};
use std::sync::Arc;
use tokio::sync::broadcast;
pub trait DiscoveryService: Sync + Send {
fn register_service(&self) -> Result<()>;
fn start_discovery(&self) -> Result<()>;
fn subscribe(&self) -> broadcast::Receiver<DiscoveryEvent>;
fn add_filter(&self, instance_name: String);
fn remove_filter(&self, instance_name: &str);
fn stop_discovery(&self) -> Result<()>;
fn refresh_services(&self) -> Result<()>;
fn shutdown(&self) -> Result<()>;
fn status(&self) -> DiscoveryServiceStatus;
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum DiscoveryImplementation {
Mdns,
Multicast,
}
pub fn create_discovery_service(
implementation: DiscoveryImplementation,
config: LocalServiceConfig,
) -> Result<Arc<dyn DiscoveryService>> {
match implementation {
DiscoveryImplementation::Mdns => {
let service = mdns::MdnsDiscoveryService::new(config)?;
Ok(Arc::new(service))
}
DiscoveryImplementation::Multicast => Err(error::HiveDiscoError::ConfigError(
"Multicast implementation is not yet complete".to_string(),
)),
}
}