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
use bytes::BytesMut; use crate::{QClass, QClass_, QType, QType_, Question}; use num_traits::ToPrimitive; use super::{encode_u16, EncodeError}; use std::collections::HashMap; impl QType_ { pub fn encode(&self, bytes: &mut BytesMut) -> Result<(), EncodeError> { if let Some(n) = self.to_u16() { encode_u16(bytes, n); Ok(()) } else { Err(EncodeError::QTypeError) } } } impl QType { pub fn encode(&self, bytes: &mut BytesMut) -> Result<(), EncodeError> { match self { QType::Type(type_) => type_.encode(bytes), QType::QType(qtype_) => qtype_.encode(bytes), } } } impl QClass_ { pub fn encode(&self, bytes: &mut BytesMut) -> Result<(), EncodeError> { if let Some(n) = self.to_u16() { encode_u16(bytes, n); Ok(()) } else { Err(EncodeError::QClassError) } } } impl QClass { pub fn encode(&self, bytes: &mut BytesMut) -> Result<(), EncodeError> { match self { QClass::Class(class) => class.encode(bytes), QClass::QClass(qclass) => qclass.encode(bytes), } } } impl Question { pub fn encode( &self, bytes: &mut BytesMut, compression: &mut HashMap<String, usize>, ) -> Result<(), EncodeError> { let offset = 0; self.domain_name.encode(bytes, &offset, compression)?; self.qtype.encode(bytes)?; self.qclass.encode(bytes) } }