use crate::{
Result,
bytes::{Cursor, Reader, RrDataReader},
names::Name,
records::Type,
};
use std::net::Ipv4Addr;
#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug, Ord, PartialOrd)]
pub struct A {
pub address: Ipv4Addr,
}
rr_data!(A, Type::A);
impl RrDataReader<A> for Cursor<'_> {
fn read_rr_data(&mut self, rd_len: usize) -> Result<A> {
self.window(rd_len)?;
let rr = Ok(A {
address: self.read()?,
});
self.close_window()?;
rr
}
}
rr_dn_data!(
Cname,
Type::CNAME,
cname
);
#[derive(Clone, Eq, PartialEq, Hash, Default, Debug, Ord, PartialOrd)]
pub struct Hinfo {
pub cpu: Vec<u8>,
pub os: Vec<u8>,
}
rr_data!(Hinfo, Type::HINFO);
impl RrDataReader<Hinfo> for Cursor<'_> {
fn read_rr_data(&mut self, rd_len: usize) -> Result<Hinfo> {
self.window(rd_len)?;
let rr = Ok(Hinfo {
cpu: self.read_character_string()?,
os: self.read_character_string()?,
});
self.close_window()?;
rr
}
}
#[derive(Clone, Eq, PartialEq, Hash, Debug, Ord, PartialOrd)]
pub struct Wks {
pub address: Ipv4Addr,
pub protocol: u8,
pub bitmap: Vec<u8>,
}
rr_data!(Wks, Type::WKS);
impl RrDataReader<Wks> for Cursor<'_> {
fn read_rr_data(&mut self, rd_len: usize) -> Result<Wks> {
self.window(rd_len)?;
let rr = Ok(Wks {
address: self.read()?,
protocol: self.u8()?,
bitmap: Vec::from(self.slice(rd_len - 5)?),
});
self.close_window()?;
rr
}
}
rr_dn_data!(
Mb,
Type::MB,
madname
);
rr_dn_data!(
Md,
Type::MD,
madname
);
rr_dn_data!(
Mf,
Type::MF,
madname
);
rr_dn_data!(
Mg,
Type::MG,
mgmname
);
#[derive(Clone, Eq, PartialEq, Hash, Default, Debug, Ord, PartialOrd)]
pub struct Minfo {
pub rmailbx: Name,
pub emailbx: Name,
}
rr_data!(Minfo, Type::MINFO);
impl RrDataReader<Minfo> for Cursor<'_> {
fn read_rr_data(&mut self, rd_len: usize) -> Result<Minfo> {
self.window(rd_len)?;
let rr = Ok(Minfo {
rmailbx: self.read()?,
emailbx: self.read()?,
});
self.close_window()?;
rr
}
}
rr_dn_data!(
Mr,
Type::MR,
newname
);
#[derive(Clone, Eq, PartialEq, Hash, Default, Debug, Ord, PartialOrd)]
pub struct Mx {
pub preference: u16,
pub exchange: Name,
}
rr_data!(Mx, Type::MX);
impl RrDataReader<Mx> for Cursor<'_> {
fn read_rr_data(&mut self, rd_len: usize) -> Result<Mx> {
self.window(rd_len)?;
let rr = Ok(Mx {
preference: self.u16_be()?,
exchange: self.read()?,
});
self.close_window()?;
rr
}
}
#[derive(Clone, Eq, PartialEq, Hash, Default, Debug, Ord, PartialOrd)]
pub struct Null {
pub anything: Vec<u8>,
}
rr_data!(Null, Type::NULL);
impl RrDataReader<Null> for Cursor<'_> {
fn read_rr_data(&mut self, rd_len: usize) -> Result<Null> {
self.window(rd_len)?;
let rr = Ok(Null {
anything: Vec::from(self.slice(rd_len)?),
});
self.close_window()?;
rr
}
}
rr_dn_data!(
Ns,
Type::NS,
nsdname
);
rr_dn_data!(
Ptr,
Type::PTR,
ptrdname
);
#[derive(Clone, Eq, PartialEq, Hash, Default, Debug, Ord, PartialOrd)]
pub struct Soa {
pub mname: Name,
pub rname: Name,
pub serial: u32,
pub refresh: u32,
pub retry: u32,
pub expire: u32,
pub minimum: u32,
}
rr_data!(Soa, Type::SOA);
impl RrDataReader<Soa> for Cursor<'_> {
fn read_rr_data(&mut self, rd_len: usize) -> Result<Soa> {
self.window(rd_len)?;
let rr = Ok(Soa {
mname: self.read()?,
rname: self.read()?,
serial: self.u32_be()?,
refresh: self.u32_be()?,
retry: self.u32_be()?,
expire: self.u32_be()?,
minimum: self.u32_be()?,
});
self.close_window()?;
rr
}
}
#[derive(Clone, Eq, PartialEq, Hash, Default, Debug, Ord, PartialOrd)]
pub struct Txt {
pub text: Vec<u8>,
}
rr_data!(Txt, Type::TXT);
impl RrDataReader<Txt> for Cursor<'_> {
fn read_rr_data(&mut self, mut rd_len: usize) -> Result<Txt> {
self.window(rd_len)?;
let mut text = Vec::with_capacity(rd_len);
while rd_len > 0 {
let len = self.u8()? as usize;
if len > 0 {
text.extend_from_slice(self.slice(len)?);
}
rd_len -= len + 1;
}
self.close_window()?;
Ok(Txt { text })
}
}