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