use core::fmt::{self, Display};
use crate::error::*;
use crate::op::Query;
use crate::rr::LowerName;
use crate::rr::{DNSClass, RecordType};
use crate::serialize::binary::*;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct LowerQuery {
name: LowerName,
original: Query,
}
impl LowerQuery {
pub fn query(query: Query) -> Self {
Self {
name: LowerName::new(query.name()),
original: query,
}
}
pub fn name(&self) -> &LowerName {
&self.name
}
pub fn original(&self) -> &Query {
&self.original
}
pub fn query_type(&self) -> RecordType {
self.original.query_type()
}
pub fn query_class(&self) -> DNSClass {
self.original.query_class()
}
}
impl From<Query> for LowerQuery {
fn from(query: Query) -> Self {
Self::query(query)
}
}
impl BinEncodable for LowerQuery {
fn emit(&self, encoder: &mut BinEncoder<'_>) -> ProtoResult<()> {
self.original.emit(encoder)
}
}
impl<'r> BinDecodable<'r> for LowerQuery {
fn read(decoder: &mut BinDecoder<'r>) -> Result<Self, DecodeError> {
let original = Query::read(decoder)?;
Ok(Self::query(original))
}
}
impl Display for LowerQuery {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
write!(
f,
"name: {} type: {} class: {}",
self.name,
self.original.query_type(),
self.original.query_class()
)
}
}