dns_parser/rdata/
mod.rs

1//! Data types and methods for handling the RData field
2
3#![allow(missing_docs)] // resource records are pretty self-descriptive
4
5pub mod a;
6pub mod aaaa;
7pub mod all;
8pub mod axfr;
9pub mod cname;
10pub mod hinfo;
11pub mod maila;
12pub mod mailb;
13pub mod mb;
14pub mod mf;
15pub mod mg;
16pub mod minfo;
17pub mod mr;
18pub mod mx;
19pub mod ns;
20pub mod nsec;
21pub mod null;
22pub mod opt;
23pub mod ptr;
24pub mod soa;
25pub mod srv;
26pub mod txt;
27pub mod wks;
28
29use {Type, Error};
30
31pub use self::a::Record as A;
32pub use self::aaaa::Record as Aaaa;
33pub use self::cname::Record as Cname;
34pub use self::mx::Record as Mx;
35pub use self::ns::Record as Ns;
36pub use self::nsec::Record as Nsec;
37pub use self::opt::Record as Opt;
38pub use self::ptr::Record as Ptr;
39pub use self::soa::Record as Soa;
40pub use self::srv::Record as Srv;
41pub use self::txt::Record as Txt;
42
43pub type RDataResult<'a> = Result<RData<'a>, Error>;
44
45/// The enumeration that represents known types of DNS resource records data
46#[derive(Debug)]
47pub enum RData<'a> {
48    A(A),
49    AAAA(Aaaa),
50    CNAME(Cname<'a>),
51    MX(Mx<'a>),
52    NS(Ns<'a>),
53    PTR(Ptr<'a>),
54    SOA(Soa<'a>),
55    SRV(Srv<'a>),
56    TXT(Txt<'a>),
57    /// Anything that can't be parsed yet
58    Unknown(&'a [u8]),
59}
60
61pub (crate) trait Record<'a> {
62    const TYPE: isize;
63
64    fn parse(rdata: &'a [u8], original: &'a [u8]) -> RDataResult<'a>;
65}
66
67impl<'a> RData<'a> {
68    /// Parse an RR data and return RData enumeration
69    pub fn parse(typ: Type, rdata: &'a [u8], original: &'a [u8]) -> RDataResult<'a> {
70        match typ {
71            Type::A         => A::parse(rdata, original),
72            Type::AAAA      => Aaaa::parse(rdata, original),
73            Type::CNAME     => Cname::parse(rdata, original),
74            Type::NS        => Ns::parse(rdata, original),
75            Type::MX        => Mx::parse(rdata, original),
76            Type::PTR       => Ptr::parse(rdata, original),
77            Type::SOA       => Soa::parse(rdata, original),
78            Type::SRV       => Srv::parse(rdata, original),
79            Type::TXT       => Txt::parse(rdata, original),
80            _               => Ok(RData::Unknown(rdata)),
81        }
82    }
83}