//! `zeroconf` is a cross-platform library that wraps underlying [ZeroConf/mDNS] implementations
//! such as [Bonjour] or [Avahi], providing an easy and idiomatic way to both register and
//! browse services.
//!
//! This crate provides the cross-platform [`MdnsService`] and [`MdnsBrowser`] available for each
//! supported platform as well as platform-specific modules for lower-level access to the mDNS
//! implementation should that be necessary.
//!
//! Most users of this crate need only [`MdnsService`] and [`MdnsBrowser`].
//!
//! # Examples
//!
//! ## Register a service
//!
//! When registering a service, you may optionally pass a "context" to pass state through the
//! callback. The only requirement is that this context implements the [`Any`] trait, which most
//! types will automatically. See [`MdnsService`] for more information about contexts.
//!
//! ```no_run
//! use std::any::Any;
//! use std::sync::{Arc, Mutex};
//! use std::time::Duration;
//! use zeroconf::prelude::*;
//! use zeroconf::{MdnsService, ServiceRegistration, ServiceType, TxtRecord};
//!
//! #[derive(Default, Debug)]
//! pub struct Context {
//! service_name: String,
//! }
//!
//! fn main() {
//! let mut service = MdnsService::new(ServiceType::new("http", "tcp").unwrap(), 8080);
//! let mut txt_record = TxtRecord::new();
//! let context: Arc<Mutex<Context>> = Arc::default();
//!
//! txt_record.insert("foo", "bar").unwrap();
//!
//! service.set_registered_callback(Box::new(on_service_registered));
//! service.set_context(Box::new(context));
//! service.set_txt_record(txt_record);
//!
//! let event_loop = service.register().unwrap();
//!
//! loop {
//! // calling `poll()` will keep this service alive
//! event_loop.poll(Duration::from_secs(0)).unwrap();
//! }
//! }
//!
//! fn on_service_registered(
//! result: zeroconf::Result<ServiceRegistration>,
//! context: Option<Arc<dyn Any>>,
//! ) {
//! let service = result.unwrap();
//!
//! println!("Service registered: {:?}", service);
//!
//! let context = context
//! .as_ref()
//! .unwrap()
//! .downcast_ref::<Arc<Mutex<Context>>>()
//! .unwrap()
//! .clone();
//!
//! context.lock().unwrap().service_name = service.name().clone();
//!
//! println!("Context: {:?}", context);
//!
//! // ...
//! }
//! ```
//!
//! ## Browsing services
//! ```no_run
//! use std::any::Any;
//! use std::sync::Arc;
//! use std::time::Duration;
//! use zeroconf::prelude::*;
//! use zeroconf::{MdnsBrowser, ServiceDiscovery, ServiceType};
//!
//! fn main() {
//! let mut browser = MdnsBrowser::new(ServiceType::new("http", "tcp").unwrap());
//!
//! browser.set_service_discovered_callback(Box::new(on_service_discovered));
//!
//! let event_loop = browser.browse_services().unwrap();
//!
//! loop {
//! // calling `poll()` will keep this browser alive
//! event_loop.poll(Duration::from_secs(0)).unwrap();
//! }
//! }
//!
//! fn on_service_discovered(
//! result: zeroconf::Result<ServiceDiscovery>,
//! _context: Option<Arc<dyn Any>>,
//! ) {
//! println!("Service discovered: {:?}", result.unwrap());
//!
//! // ...
//! }
//! ```
//!
//! [ZeroConf/mDNS]: https://en.wikipedia.org/wiki/Zero-configuration_networking
//! [Bonjour]: https://en.wikipedia.org/wiki/Bonjour_(software)
//! [Avahi]: https://en.wikipedia.org/wiki/Avahi_(software)
//! [`MdnsService`]: type.MdnsService.html
//! [`MdnsBrowser`]: type.MdnsBrowser.html
//! [`Any`]: https://doc.rust-lang.org/std/any/trait.Any.html
extern crate serde;
extern crate derive_builder;
extern crate zeroconf_macros;
extern crate avahi_sys;
extern crate bonjour_sys;
extern crate derive_getters;
extern crate log;
extern crate derive_new;
extern crate maplit;
pub use ;
pub use *;
pub use ;
pub use *;
/// Type alias for the platform-specific mDNS browser implementation
pub type MdnsBrowser = AvahiMdnsBrowser;
/// Type alias for the platform-specific mDNS browser implementation
pub type MdnsBrowser = BonjourMdnsBrowser;
/// Type alias for the platform-specific mDNS service implementation
pub type MdnsService = AvahiMdnsService;
/// Type alias for the platform-specific mDNS service implementation
pub type MdnsService = BonjourMdnsService;
/// Type alias for the platform-specific structure responsible for polling the mDNS event loop
pub type EventLoop<'a> = AvahiEventLoop;
/// Type alias for the platform-specific structure responsible for polling the mDNS event loop
pub type EventLoop<'a> = BonjourEventLoop;
/// Type alias for the platform-specific structure responsible for storing and accessing TXT
/// record data
pub type TxtRecord = AvahiTxtRecord;
/// Type alias for the platform-specific structure responsible for storing and accessing TXT
/// record data
pub type TxtRecord = BonjourTxtRecord;
/// Result type for this library
pub type Result<T> = Result;