rsip_dns/resolvables/
resolvable_ip_addr.rs

1use crate::{
2    resolvables::{Resolvable, ResolvableExt, ResolvableState},
3    Target,
4};
5use async_trait::async_trait;
6use rsip::{Port, Transport};
7use std::net::IpAddr;
8
9#[derive(Debug, Clone)]
10pub struct ResolvableIpAddr {
11    ip_addr: Resolvable<IpAddr>,
12    port: Port,
13    transport: Transport,
14}
15
16#[async_trait]
17impl ResolvableExt<Target> for ResolvableIpAddr {
18    fn state(&self) -> ResolvableState {
19        self.ip_addr.state()
20    }
21
22    async fn resolve_next(&mut self) -> Option<Target> {
23        self.ip_addr.resolve_next().await.map(|ip_addr| Target {
24            ip_addr,
25            port: self.port,
26            transport: self.transport,
27        })
28    }
29}
30
31impl ResolvableIpAddr {
32    pub fn new(ip_addr: IpAddr, port: Port, transport: Transport) -> Self {
33        Self { ip_addr: Resolvable::non_empty(vec![ip_addr]), port, transport }
34    }
35}
36
37#[cfg(all(test, feature = "dns", feature = "test-utils"))]
38mod tests {
39    #[tokio::test]
40    async fn resolves() {
41        use super::*;
42        use testing_utils::Randomize;
43
44        let mut resolvable =
45            ResolvableIpAddr::new(Randomize::random(), Randomize::random(), Randomize::random());
46
47        assert!(resolvable.resolve_next().await.is_some());
48        assert!(resolvable.resolve_next().await.is_none());
49    }
50}