rsip_dns/resolvables/
resolvable_enum.rs1use crate::{
2 resolvables::{
3 ResolvableAddrRecord, ResolvableExt, ResolvableIpAddr, ResolvableNaptrRecord,
4 ResolvableSrvRecord, ResolvableState,
5 },
6 DnsClient, Target,
7};
8use async_trait::async_trait;
9
10#[derive(Debug, Clone)]
11pub enum ResolvableEnum<C>
12where
13 C: DnsClient,
14{
15 IpAddr(ResolvableIpAddr),
16 AddrRecord(ResolvableAddrRecord<C>),
17 SrvRecord(ResolvableSrvRecord<C>),
18 NaptrRecord(ResolvableNaptrRecord<C>),
19}
20
21#[async_trait]
22impl<C> ResolvableExt<Target> for ResolvableEnum<C>
23where
24 C: DnsClient,
25{
26 fn state(&self) -> ResolvableState {
27 match self {
28 Self::IpAddr(inner) => inner.state(),
29 Self::AddrRecord(inner) => inner.state(),
30 Self::SrvRecord(inner) => inner.state(),
31 Self::NaptrRecord(inner) => inner.state(),
32 }
33 }
34
35 async fn resolve_next(&mut self) -> Option<Target> {
36 match self {
37 Self::IpAddr(inner) => inner.resolve_next().await,
38 Self::AddrRecord(inner) => inner.resolve_next().await,
39 Self::SrvRecord(inner) => inner.resolve_next().await,
40 Self::NaptrRecord(inner) => inner.resolve_next().await,
41 }
42 }
43}
44
45impl<C: DnsClient> From<ResolvableIpAddr> for ResolvableEnum<C> {
46 fn from(from: ResolvableIpAddr) -> Self {
47 Self::IpAddr(from)
48 }
49}
50
51impl<C: DnsClient> From<ResolvableAddrRecord<C>> for ResolvableEnum<C> {
52 fn from(from: ResolvableAddrRecord<C>) -> Self {
53 Self::AddrRecord(from)
54 }
55}
56
57impl<C: DnsClient> From<ResolvableSrvRecord<C>> for ResolvableEnum<C> {
58 fn from(from: ResolvableSrvRecord<C>) -> Self {
59 Self::SrvRecord(from)
60 }
61}
62
63impl<C: DnsClient> From<ResolvableNaptrRecord<C>> for ResolvableEnum<C> {
64 fn from(from: ResolvableNaptrRecord<C>) -> Self {
65 Self::NaptrRecord(from)
66 }
67}