Skip to content

Commit b5194fb

Browse files
authored
Add resolver that returns a single host (#55)
1 parent bfce880 commit b5194fb

File tree

2 files changed

+64
-0
lines changed

2 files changed

+64
-0
lines changed

src/resolvers/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
//! Default implementations of [crate::resolver::Resolver]
22
33
pub mod dns;
4+
pub mod single_host;

src/resolvers/single_host.rs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
//! Implementation of [Resolver] that always returns an explicit address.
2+
3+
use tokio::sync::watch;
4+
5+
use crate::backend;
6+
use crate::resolver::{AllBackends, Resolver};
7+
8+
use std::collections::BTreeMap;
9+
use std::net::SocketAddr;
10+
use std::sync::Arc;
11+
12+
/// A [`Resolver`] that always returns a single address.
13+
#[derive(Clone, Debug)]
14+
pub struct SingleHostResolver {
15+
tx: watch::Sender<AllBackends>,
16+
}
17+
18+
const SINGLE_HOST_BACKEND_NAME: &str = "singleton";
19+
20+
impl SingleHostResolver {
21+
/// Construct a resolver to always return the provided address.
22+
pub fn new(address: SocketAddr) -> Self {
23+
let backends = Arc::new(BTreeMap::from([(
24+
backend::Name::new(SINGLE_HOST_BACKEND_NAME),
25+
backend::Backend { address },
26+
)]));
27+
let (tx, _rx) = watch::channel(backends.clone());
28+
Self { tx }
29+
}
30+
}
31+
32+
impl Resolver for SingleHostResolver {
33+
fn monitor(&mut self) -> watch::Receiver<AllBackends> {
34+
self.tx.subscribe()
35+
}
36+
}
37+
38+
#[cfg(test)]
39+
mod tests {
40+
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
41+
42+
use crate::{
43+
backend::Backend, resolver::Resolver as _, resolvers::single_host::SINGLE_HOST_BACKEND_NAME,
44+
};
45+
46+
use super::SingleHostResolver;
47+
48+
#[test]
49+
fn single_host_resolver_returns_address() {
50+
let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 4444);
51+
let mut res = SingleHostResolver::new(addr);
52+
let rx = res.monitor();
53+
let backends = rx.borrow();
54+
assert_eq!(backends.len(), 1);
55+
let Backend { address } = backends
56+
.get(SINGLE_HOST_BACKEND_NAME)
57+
.expect("Expected the single host backend name");
58+
assert_eq!(
59+
address, &addr,
60+
"Single host resolver returned wrong address"
61+
);
62+
}
63+
}

0 commit comments

Comments
 (0)