rlibdns 0.1.211

Rust DNS Library
Documentation
use std::fmt;
use std::fmt::Formatter;
use std::str::FromStr;

#[derive(Copy, Default, Clone, Eq, PartialEq, Hash, Debug)]
pub enum RRClasses {
    #[default]
    In,
    Ch,
    Hs,
    None,
    Any
}

impl RRClasses {

    pub fn get_code(&self) -> u16 {
        match self {
            Self::In => 1,
            Self::Ch => 3,
            Self::Hs => 4,
            Self::None => 254,
            Self::Any => 255
        }
    }
}

#[derive(Debug, Clone, Eq, PartialEq)]
pub enum RRClassParseError {
    UnknownCode(u16),
    UnknownName(String)
}

impl fmt::Display for RRClassParseError {

    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
        write!(f, "{}", match self {
            Self::UnknownCode(v) => format!("unknown class code: {}", v),
            Self::UnknownName(s) => format!("unknown class name: {}", s)
        })
    }
}

impl TryFrom<u16> for RRClasses {

    type Error = RRClassParseError;

    fn try_from(v: u16) -> Result<Self, Self::Error> {
        Ok(match v {
            1 => Self::In,
            3 => Self::Ch,
            4 => Self::Hs,
            254 => Self::None,
            255 => Self::Any,
            _  => return Err(RRClassParseError::UnknownCode(v))
        })
    }
}

impl FromStr for RRClasses {

    type Err = RRClassParseError;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        Ok(match s {
            "IN" => Self::In,
            "CH" => Self::Ch,
            "HS" => Self::Hs,
            "NONE" => Self::None,
            "ANY" => Self::Any,
            _  => return Err(RRClassParseError::UnknownName(s.to_string()))
        })
    }
}

impl fmt::Display for RRClasses {

    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
        write!(f, "{}", match self {
            Self::In => "IN",
            Self::Ch => "CH",
            Self::Hs => "HS",
            Self::None => "NONE",
            Self::Any => "ANY"
        })
    }
}