rlibdns 0.1.211

Rust DNS Library
Documentation
use crate::messages::inter::rr_classes::RRClasses;
use crate::messages::inter::rr_types::RRTypes;
use crate::rr_data::inter::rr_data::RRData;

#[derive(Debug, Clone)]
pub struct RRSet {
    _type: RRTypes,
    ttl: u32,
    data: Vec<u8>
}

impl RRSet {

    pub fn new(_type: RRTypes, ttl: u32) -> Self {
        Self {
            _type,
            ttl,
            data: Vec::new()
        }
    }

    pub fn set_type(&mut self, _type: RRTypes) {
        self._type = _type;
    }

    pub fn get_type(&self) -> RRTypes {
        self._type
    }

    pub fn set_ttl(&mut self, ttl: u32) {
        self.ttl = ttl;
    }

    pub fn get_ttl(&self) -> u32 {
        self.ttl
    }

    pub fn add_data(&mut self, ttl: u32, data: Box<dyn RRData>) {
        if self.ttl != ttl {
            self.ttl = self.ttl.min(ttl);
        }

        self.data.extend_from_slice(&data.to_bytes().unwrap());
    }

    pub fn data(&self/*, class: &RRClasses*/) -> RRSetIter {
        RRSetIter {
            set: self,
            class: RRClasses::In,
            off: 0
        }
    }

    pub fn total_data(&self) -> usize {
        self.data.len()
    }
}

pub struct RRSetIter<'a> {
    set: &'a RRSet,
    class: RRClasses,
    off: usize
}

impl<'a> Iterator for RRSetIter<'a> {

    type Item = Box<dyn RRData>;

    fn next(&mut self) -> Option<Self::Item> {
        if self.off >= self.set.data.len() {
            return None;
        }

        let data = <dyn RRData>::from_wire(self.set._type, &self.class, &self.set.data[self.off..], 0).unwrap();
        self.off += 2+u16::from_be_bytes([self.set.data[self.off], self.set.data[self.off+1]]) as usize;

        Some(data)
    }
}