rsip-dns 0.1.4

SIP Rust library implementing RFC 3263, implemented on top of rsip
Documentation
use crate::{
    resolvables::{
        ResolvableAddrRecord, ResolvableExt, ResolvableIpAddr, ResolvableNaptrRecord,
        ResolvableSrvRecord, ResolvableState,
    },
    DnsClient, Target,
};
use async_trait::async_trait;

#[derive(Debug, Clone)]
pub enum ResolvableEnum<C>
where
    C: DnsClient,
{
    IpAddr(ResolvableIpAddr),
    AddrRecord(ResolvableAddrRecord<C>),
    SrvRecord(ResolvableSrvRecord<C>),
    NaptrRecord(ResolvableNaptrRecord<C>),
}

#[async_trait]
impl<C> ResolvableExt<Target> for ResolvableEnum<C>
where
    C: DnsClient,
{
    fn state(&self) -> ResolvableState {
        match self {
            Self::IpAddr(inner) => inner.state(),
            Self::AddrRecord(inner) => inner.state(),
            Self::SrvRecord(inner) => inner.state(),
            Self::NaptrRecord(inner) => inner.state(),
        }
    }

    async fn resolve_next(&mut self) -> Option<Target> {
        match self {
            Self::IpAddr(inner) => inner.resolve_next().await,
            Self::AddrRecord(inner) => inner.resolve_next().await,
            Self::SrvRecord(inner) => inner.resolve_next().await,
            Self::NaptrRecord(inner) => inner.resolve_next().await,
        }
    }
}

impl<C: DnsClient> From<ResolvableIpAddr> for ResolvableEnum<C> {
    fn from(from: ResolvableIpAddr) -> Self {
        Self::IpAddr(from)
    }
}

impl<C: DnsClient> From<ResolvableAddrRecord<C>> for ResolvableEnum<C> {
    fn from(from: ResolvableAddrRecord<C>) -> Self {
        Self::AddrRecord(from)
    }
}

impl<C: DnsClient> From<ResolvableSrvRecord<C>> for ResolvableEnum<C> {
    fn from(from: ResolvableSrvRecord<C>) -> Self {
        Self::SrvRecord(from)
    }
}

impl<C: DnsClient> From<ResolvableNaptrRecord<C>> for ResolvableEnum<C> {
    fn from(from: ResolvableNaptrRecord<C>) -> Self {
        Self::NaptrRecord(from)
    }
}