mod character_string;
pub use character_string::CharacterString;
mod name;
pub use name::{Label, Name};
mod packet;
pub use packet::Packet;
mod header;
use header::Header;
pub mod header_buffer;
mod wire_format;
pub(crate) use wire_format::WireFormat;
mod question;
pub use question::Question;
pub mod rdata;
pub use rdata::TYPE;
mod resource_record;
pub use resource_record::ResourceRecord;
use crate::lib::TryFrom;
use bitflags::bitflags;
const MAX_LABEL_LENGTH: usize = 63;
const MAX_NAME_LENGTH: usize = 255;
const MAX_CHARACTER_STRING_LENGTH: usize = 255;
const MAX_NULL_LENGTH: usize = 65535;
bitflags! {
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub struct PacketFlag: u16 {
const RESPONSE = 0b1000_0000_0000_0000;
const AUTHORITATIVE_ANSWER = 0b0000_0100_0000_0000;
const TRUNCATION = 0b0000_0010_0000_0000;
const RECURSION_DESIRED = 0b0000_0001_0000_0000;
const RECURSION_AVAILABLE = 0b0000_0000_1000_0000;
#[allow(missing_docs)]
const AUTHENTIC_DATA = 0b0000_0000_0010_0000;
#[allow(missing_docs)]
const CHECKING_DISABLED = 0b0000_0000_0001_0000;
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum QTYPE {
TYPE(TYPE),
IXFR,
AXFR,
MAILB,
MAILA,
ANY,
}
impl From<TYPE> for QTYPE {
fn from(v: TYPE) -> Self {
Self::TYPE(v)
}
}
impl TryFrom<u16> for QTYPE {
type Error = crate::SimpleDnsError;
fn try_from(value: u16) -> Result<Self, Self::Error> {
match value {
251 => Ok(QTYPE::IXFR),
252 => Ok(QTYPE::AXFR),
253 => Ok(QTYPE::MAILB),
254 => Ok(QTYPE::MAILA),
255 => Ok(QTYPE::ANY),
v => match TYPE::from(v) {
TYPE::Unknown(_) => Err(Self::Error::InvalidQType(v)),
ty => Ok(ty.into()),
},
}
}
}
impl From<QTYPE> for u16 {
fn from(val: QTYPE) -> Self {
match val {
QTYPE::TYPE(ty) => ty.into(),
QTYPE::IXFR => 251,
QTYPE::AXFR => 252,
QTYPE::MAILB => 253,
QTYPE::MAILA => 254,
QTYPE::ANY => 255,
}
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum CLASS {
IN = 1,
CS = 2,
CH = 3,
HS = 4,
NONE = 254,
}
impl TryFrom<u16> for CLASS {
type Error = crate::SimpleDnsError;
fn try_from(value: u16) -> Result<Self, Self::Error> {
use self::CLASS::*;
match value {
1 => Ok(IN),
2 => Ok(CS),
3 => Ok(CH),
4 => Ok(HS),
254 => Ok(NONE),
v => Err(Self::Error::InvalidClass(v)),
}
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum QCLASS {
CLASS(CLASS),
ANY,
}
impl From<CLASS> for QCLASS {
fn from(v: CLASS) -> Self {
Self::CLASS(v)
}
}
impl TryFrom<u16> for QCLASS {
type Error = crate::SimpleDnsError;
fn try_from(value: u16) -> Result<Self, Self::Error> {
match value {
255 => Ok(QCLASS::ANY),
v => CLASS::try_from(v).map(|x| x.into()),
}
}
}
impl From<QCLASS> for u16 {
fn from(val: QCLASS) -> Self {
match val {
QCLASS::CLASS(class) => class as u16,
QCLASS::ANY => 255,
}
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum OPCODE {
StandardQuery = 0,
InverseQuery = 1,
ServerStatusRequest = 2,
Notify = 4,
Update = 5,
Reserved,
}
impl From<u16> for OPCODE {
fn from(code: u16) -> Self {
match code {
0 => OPCODE::StandardQuery,
1 => OPCODE::InverseQuery,
2 => OPCODE::ServerStatusRequest,
4 => OPCODE::Notify,
5 => OPCODE::Update,
_ => OPCODE::Reserved,
}
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum RCODE {
NoError = 0,
FormatError = 1,
ServerFailure = 2,
NameError = 3,
NotImplemented = 4,
Refused = 5,
YXDOMAIN = 6,
YXRRSET = 7,
NXRRSET = 8,
NOTAUTH = 9,
NOTZONE = 10,
BADVERS = 16,
Reserved,
}
impl From<u16> for RCODE {
fn from(code: u16) -> Self {
use RCODE::*;
match code {
0 => NoError,
1 => FormatError,
2 => ServerFailure,
3 => NameError,
4 => NotImplemented,
5 => Refused,
6 => YXDOMAIN,
7 => YXRRSET,
8 => NXRRSET,
9 => NOTAUTH,
10 => NOTZONE,
16 => BADVERS,
_ => RCODE::Reserved,
}
}
}