1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
use crate::encode::Encoder;
use crate::rr::{Class, Type, A, HINFO, SOA, WKS};
use crate::EncodeResult;

impl Encoder {
    pub(super) fn rr_a(&mut self, a: &A) -> EncodeResult<()> {
        self.domain_name(&a.domain_name)?;
        self.rr_type(&Type::A);
        self.rr_class(&Class::IN);
        self.u32(a.ttl);
        let length_index = self.create_length_index();
        self.ipv4_addr(&a.ipv4_addr);
        self.set_length_index(length_index)
    }

    impl_encode_rr_domain_name!(NS, ns_d_name, rr_ns);

    impl_encode_rr_domain_name!(MD, mad_name, rr_md);

    impl_encode_rr_domain_name!(MF, mad_name, rr_mf);

    impl_encode_rr_domain_name!(CNAME, c_name, rr_cname);

    pub(super) fn rr_soa(&mut self, soa: &SOA) -> EncodeResult<()> {
        self.domain_name(&soa.domain_name)?;
        self.rr_type(&Type::SOA);
        self.rr_class(&soa.class);
        self.u32(soa.ttl);
        let length_index = self.create_length_index();
        self.domain_name(&soa.m_name)?;
        self.domain_name(&soa.r_name)?;
        self.u32(soa.serial);
        self.u32(soa.refresh);
        self.u32(soa.retry);
        self.u32(soa.expire);
        self.u32(soa.min_ttl);
        self.set_length_index(length_index)
    }

    impl_encode_rr_domain_name!(MB, mad_name, rr_mb);

    impl_encode_rr_domain_name!(MG, mgm_name, rr_mg);

    impl_encode_rr_domain_name!(MR, new_name, rr_mr);

    impl_encode_rr_vec!(NULL, data, rr_null);

    pub(super) fn rr_wks(&mut self, wks: &WKS) -> EncodeResult<()> {
        self.domain_name(&wks.domain_name)?;
        self.rr_type(&Type::WKS);
        self.rr_class(&Class::IN);
        self.u32(wks.ttl);
        let length_index = self.create_length_index();
        self.ipv4_addr(&wks.ipv4_addr);
        self.u8(wks.protocol);
        self.vec(&wks.bit_map);
        self.set_length_index(length_index)
    }

    impl_encode_rr_domain_name!(PTR, ptr_d_name, rr_ptr);

    pub(super) fn rr_hinfo(&mut self, hinfo: &HINFO) -> EncodeResult<()> {
        self.domain_name(&hinfo.domain_name)?;
        self.rr_type(&Type::HINFO);
        self.rr_class(&hinfo.class);
        self.u32(hinfo.ttl);
        let length_index = self.create_length_index();
        self.string(&hinfo.cpu)?;
        self.string(&hinfo.os)?;
        self.set_length_index(length_index)
    }

    impl_encode_rr_domain_name_domain_name!(MINFO, r_mail_bx, e_mail_bx, rr_minfo);

    impl_encode_rr_u16_domain_name!(MX, preference, exchange, rr_mx);

    impl_encode_rr_string!(TXT, string, rr_txt);
}

impl_encode_rr!(A, rr_a);

impl_encode_rr!(NS, rr_ns);

impl_encode_rr!(MD, rr_md);

impl_encode_rr!(MF, rr_mf);

impl_encode_rr!(CNAME, rr_cname);

impl_encode_rr!(SOA, rr_soa);

impl_encode_rr!(MB, rr_mb);

impl_encode_rr!(MG, rr_mg);

impl_encode_rr!(MR, rr_mr);

impl_encode_rr!(NULL, rr_null);

impl_encode_rr!(WKS, rr_wks);

impl_encode_rr!(PTR, rr_ptr);

impl_encode_rr!(HINFO, rr_hinfo);

impl_encode_rr!(MINFO, rr_minfo);

impl_encode_rr!(MX, rr_mx);

impl_encode_rr!(TXT, rr_txt);