use mdns::Mdns;
use mdns::MdnsConfig;
use std::net::{IpAddr, Ipv4Addr};
use std::time::Duration;
use uuid::Uuid;
use shared::error::Result;
#[derive(Default, PartialEq, Eq, Debug, Copy, Clone)]
pub enum MulticastDnsMode {
Disabled,
#[default]
QueryOnly,
QueryAndGather,
}
pub(crate) fn generate_multicast_dns_name() -> String {
let u = Uuid::new_v4();
format!("{u}.local")
}
pub(crate) fn create_multicast_dns(
mdns_mode: MulticastDnsMode,
mdns_local_name: &str,
mdns_local_ip: &Option<IpAddr>,
mdns_query_timeout: &Option<Duration>,
) -> Result<Option<Mdns>> {
if mdns_mode == MulticastDnsMode::Disabled {
return Ok(None);
}
let mut config = if mdns_mode == MulticastDnsMode::QueryAndGather {
let local_ip = if let Some(local_ip) = mdns_local_ip {
*local_ip
} else {
IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1))
};
log::info!("mDNS is using {local_ip} as local ip");
MdnsConfig::new()
.with_local_names(vec![mdns_local_name.to_owned()])
.with_local_ip(local_ip)
} else {
MdnsConfig::new()
};
if let Some(query_timeout) = mdns_query_timeout {
config = config.with_query_timeout(*query_timeout);
}
let mdns_server = Mdns::new(config);
Ok(Some(mdns_server))
}