rsip_dns/resolvables/
resolvable_ip_addr.rs1use 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}