use tokio::sync::watch;
use crate::backend;
use crate::resolver::{AllBackends, Resolver};
use std::collections::BTreeMap;
use std::net::SocketAddr;
use std::sync::Arc;
#[derive(Clone, Debug)]
#[deprecated = "Prefer to use FixedResolver with a single address"]
pub struct SingleHostResolver {
tx: watch::Sender<AllBackends>,
}
const SINGLE_HOST_BACKEND_NAME: &str = "singleton";
#[allow(deprecated)]
impl SingleHostResolver {
pub fn new(address: SocketAddr) -> Self {
let backends = Arc::new(BTreeMap::from([(
backend::Name::new(SINGLE_HOST_BACKEND_NAME),
backend::Backend { address },
)]));
let (tx, _rx) = watch::channel(backends.clone());
Self { tx }
}
}
#[allow(deprecated)]
impl Resolver for SingleHostResolver {
fn monitor(&mut self) -> watch::Receiver<AllBackends> {
self.tx.subscribe()
}
}
#[cfg(test)]
#[allow(deprecated)]
mod tests {
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
use crate::{
backend::Backend, resolver::Resolver as _, resolvers::single_host::SINGLE_HOST_BACKEND_NAME,
};
use super::SingleHostResolver;
#[test]
fn single_host_resolver_returns_address() {
let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 4444);
let mut res = SingleHostResolver::new(addr);
let rx = res.monitor();
let backends = rx.borrow();
assert_eq!(backends.len(), 1);
let Backend { address } = backends
.get(SINGLE_HOST_BACKEND_NAME)
.expect("Expected the single host backend name");
assert_eq!(
address, &addr,
"Single host resolver returned wrong address"
);
}
}