dns-message-parser 0.2.0

Libary to encode and decode DNS packets
Documentation
use bytes::{BufMut, BytesMut};

use std::mem::size_of;
use std::net::{Ipv4Addr, Ipv6Addr};

use super::EncodeError;

pub(super) fn encode_u8(bytes: &mut BytesMut, n: u8) {
    bytes.reserve(size_of::<u8>());
    bytes.put_u8(n)
}

pub(super) fn encode_u16(bytes: &mut BytesMut, n: u16) {
    bytes.reserve(size_of::<u16>());
    bytes.put_u16(n)
}

pub(super) fn encode_u32(bytes: &mut BytesMut, n: u32) {
    bytes.reserve(size_of::<u32>());
    bytes.put_u32(n)
}

pub(super) fn encode_ipv4_addr(bytes: &mut BytesMut, ipv4_addr: &Ipv4Addr) {
    let octets = ipv4_addr.octets();

    encode_u8(bytes, octets[0]);
    encode_u8(bytes, octets[1]);
    encode_u8(bytes, octets[2]);
    encode_u8(bytes, octets[3]);
}

pub(super) fn encode_ipv6_addr(bytes: &mut BytesMut, ipv6_addr: &Ipv6Addr) {
    let octets = ipv6_addr.octets();

    encode_u8(bytes, octets[0]);
    encode_u8(bytes, octets[1]);
    encode_u8(bytes, octets[2]);
    encode_u8(bytes, octets[3]);
    encode_u8(bytes, octets[4]);
    encode_u8(bytes, octets[5]);
    encode_u8(bytes, octets[6]);
    encode_u8(bytes, octets[7]);
    encode_u8(bytes, octets[8]);
    encode_u8(bytes, octets[9]);
    encode_u8(bytes, octets[10]);
    encode_u8(bytes, octets[11]);
    encode_u8(bytes, octets[12]);
    encode_u8(bytes, octets[13]);
    encode_u8(bytes, octets[14]);
    encode_u8(bytes, octets[15]);
}

pub(super) fn encode_string(bytes: &mut BytesMut, s: &str) -> Result<(), EncodeError> {
    let length = s.len();

    if length > 255 {
        return Err(EncodeError::TooMuchData);
    }

    encode_u8(bytes, length as u8);
    bytes.extend_from_slice(s.as_bytes());

    Ok(())
}