rsip_dns/resolvables/
resolvable_enum.rs

1use 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}