dns_message_parser/decode/rr/
enums.rs

1use crate::decode::Decoder;
2use crate::rr::{Class, Type, RR};
3use crate::{DecodeError, DecodeResult, DomainName};
4use std::convert::TryFrom;
5
6pub(super) struct Header {
7    pub(super) domain_name: DomainName,
8    pub(super) class: u16,
9    pub(super) ttl: u32,
10}
11
12impl Header {
13    pub(super) fn get_class(&self) -> DecodeResult<Class> {
14        match Class::try_from(self.class) {
15            Ok(class) => Ok(class),
16            Err(buffer) => Err(DecodeError::Class(buffer)),
17        }
18    }
19}
20
21impl<'a, 'b: 'a> Decoder<'b, 'b> {
22    fn rr_data(&'a mut self) -> DecodeResult<Decoder<'a, 'b>> {
23        let rd_length = self.u16()?;
24        let r_data = self.sub(rd_length)?;
25        Ok(r_data)
26    }
27
28    pub fn rr(&'a mut self) -> DecodeResult<RR> {
29        let (type_, header) = self.rr_header()?;
30        let mut r_data = self.rr_data()?;
31        let rr = match type_ {
32            Type::A => RR::A(r_data.rr_a(header)?),
33            Type::NS => RR::NS(r_data.rr_ns(header)?),
34            Type::MD => RR::MD(r_data.rr_md(header)?),
35            Type::MF => RR::MF(r_data.rr_mf(header)?),
36            Type::CNAME => RR::CNAME(r_data.rr_cname(header)?),
37            Type::SOA => RR::SOA(r_data.rr_soa(header)?),
38            Type::MB => RR::MB(r_data.rr_mb(header)?),
39            Type::MG => RR::MG(r_data.rr_mg(header)?),
40            Type::MR => RR::MR(r_data.rr_mr(header)?),
41            Type::NULL => RR::NULL(r_data.rr_null(header)?),
42            Type::WKS => RR::WKS(r_data.rr_wks(header)?),
43            Type::PTR => RR::PTR(r_data.rr_ptr(header)?),
44            Type::HINFO => RR::HINFO(r_data.rr_hinfo(header)?),
45            Type::MINFO => RR::MINFO(r_data.rr_minfo(header)?),
46            Type::MX => RR::MX(r_data.rr_mx(header)?),
47            Type::TXT => RR::TXT(r_data.rr_txt(header)?),
48            Type::RP => RR::RP(r_data.rr_rp(header)?),
49            Type::AFSDB => RR::AFSDB(r_data.rr_afsdb(header)?),
50            Type::X25 => RR::X25(r_data.rr_x25(header)?),
51            Type::ISDN => RR::ISDN(r_data.rr_isdn(header)?),
52            Type::RT => RR::RT(r_data.rr_rt(header)?),
53            Type::NSAP => RR::NSAP(r_data.rr_nsap(header)?),
54            Type::GPOS => RR::GPOS(r_data.rr_gpos(header)?),
55            Type::LOC => RR::LOC(r_data.rr_loc(header)?),
56            Type::PX => RR::PX(r_data.rr_px(header)?),
57            Type::KX => RR::KX(r_data.rr_kx(header)?),
58            Type::SRV => RR::SRV(r_data.rr_srv(header)?),
59            Type::AAAA => RR::AAAA(r_data.rr_aaaa(header)?),
60            Type::SSHFP => RR::SSHFP(r_data.rr_sshfp(header)?),
61            Type::DNAME => RR::DNAME(r_data.rr_dname(header)?),
62            Type::OPT => RR::OPT(r_data.rr_opt(header)?),
63            Type::APL => RR::APL(r_data.rr_apl(header)?),
64            Type::NID => RR::NID(r_data.rr_nid(header)?),
65            Type::L32 => RR::L32(r_data.rr_l32(header)?),
66            Type::L64 => RR::L64(r_data.rr_l64(header)?),
67            Type::LP => RR::LP(r_data.rr_lp(header)?),
68            Type::EUI48 => RR::EUI48(r_data.rr_eui48(header)?),
69            Type::EUI64 => RR::EUI64(r_data.rr_eui64(header)?),
70            Type::URI => RR::URI(r_data.rr_uri(header)?),
71            Type::EID => RR::EID(r_data.rr_eid(header)?),
72            Type::NIMLOC => RR::NIMLOC(r_data.rr_nimloc(header)?),
73            Type::DNSKEY => RR::DNSKEY(r_data.rr_dnskey(header)?),
74            Type::DS => RR::DS(r_data.rr_ds(header)?),
75            Type::CAA => RR::CAA(r_data.rr_caa(header)?),
76            Type::SVCB => RR::SVCB(r_data.rr_service_binding(header, false)?),
77            Type::HTTPS => RR::HTTPS(r_data.rr_service_binding(header, true)?),
78            type_ => return Err(DecodeError::NotYetImplemented(type_)),
79        };
80        r_data.finished()?;
81        Ok(rr)
82    }
83}
84
85impl<'a, 'b: 'a> Decoder<'a, 'b> {
86    fn rr_header(&mut self) -> DecodeResult<(Type, Header)> {
87        let domain_name = self.domain_name()?;
88        let type_ = self.rr_type()?;
89        let class = self.u16()?;
90        let ttl = self.u32()?;
91        let header = Header {
92            domain_name,
93            class,
94            ttl,
95        };
96        Ok((type_, header))
97    }
98
99    pub fn rr_class(&mut self) -> DecodeResult<Class> {
100        let buffer = self.u16()?;
101        match Class::try_from(buffer) {
102            Ok(class) => Ok(class),
103            Err(buffer) => Err(DecodeError::Class(buffer)),
104        }
105    }
106
107    pub fn rr_type(&mut self) -> DecodeResult<Type> {
108        let buffer = self.u16()?;
109        match Type::try_from(buffer) {
110            Ok(type_) => Ok(type_),
111            Err(buffer) => Err(DecodeError::Type(buffer)),
112        }
113    }
114}
115
116impl_decode!(Class, rr_class);
117
118impl_decode!(Type, rr_type);
119
120impl_decode!(RR, rr);