rsip_dns/resolvables/
resolvable_srv_record.rs

1use crate::{
2    records::SrvDomain,
3    resolvables::{ResolvableAddrRecord, ResolvableExt, ResolvableState, ResolvableVec},
4    DnsClient, Target,
5};
6use async_trait::async_trait;
7
8#[derive(Debug, Clone)]
9pub struct ResolvableSrvRecord<C>
10where
11    C: DnsClient,
12{
13    dns_client: C,
14    domain: SrvDomain,
15    resolvable_addr_records: ResolvableVec<ResolvableAddrRecord<C>, Target>,
16}
17
18#[async_trait]
19impl<C> ResolvableExt<Target> for ResolvableSrvRecord<C>
20where
21    C: DnsClient,
22{
23    fn state(&self) -> ResolvableState {
24        self.resolvable_addr_records.state()
25    }
26
27    async fn resolve_next(&mut self) -> Option<Target> {
28        if self.resolvable_addr_records.is_unset() {
29            self.resolve_domain().await;
30        }
31
32        self.resolvable_addr_records.resolve_next().await
33    }
34}
35
36impl<C> ResolvableSrvRecord<C>
37where
38    C: DnsClient,
39{
40    pub fn new(dns_client: C, domain: SrvDomain) -> Self {
41        Self { dns_client, domain, resolvable_addr_records: Default::default() }
42    }
43
44    async fn resolve_domain(&mut self) {
45        match self.dns_client.srv_lookup(self.domain.clone()).await {
46            Some(srv_record) => {
47                let resolvable_addr_records = srv_record
48                    .domains_with_ports()
49                    .into_iter()
50                    .map(|(domain, port)| {
51                        ResolvableAddrRecord::new(
52                            self.dns_client.clone(),
53                            domain,
54                            port,
55                            srv_record.transport(),
56                        )
57                    })
58                    .collect::<Vec<_>>();
59
60                self.resolvable_addr_records = ResolvableVec::non_empty(resolvable_addr_records)
61            }
62            None => {
63                self.resolvable_addr_records = ResolvableVec::empty();
64            }
65        }
66    }
67}