use rr::domain::Name;
use rr::record_type::RecordType;
use rr::dns_class::DNSClass;
use ::serialize::binary::*;
use ::error::*;
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
pub struct Query {
name: Name,
query_type: RecordType,
query_class: DNSClass,
}
impl Query {
pub fn new() -> Self {
Query {
name: Name::new(),
query_type: RecordType::A,
query_class: DNSClass::IN,
}
}
pub fn set_name(&mut self, name: Name) -> &mut Self {
self.name = name;
self
}
pub fn set_query_type(&mut self, query_type: RecordType) -> &mut Self {
self.query_type = query_type;
self
}
pub fn set_query_class(&mut self, query_class: DNSClass) -> &mut Self {
self.query_class = query_class;
self
}
pub fn name(&self) -> &Name {
&self.name
}
pub fn query_type(&self) -> RecordType {
self.query_type
}
pub fn query_class(&self) -> DNSClass {
self.query_class
}
}
impl BinSerializable<Query> for Query {
fn read(decoder: &mut BinDecoder) -> DecodeResult<Self> {
let name = try!(Name::read(decoder));
let query_type = try!(RecordType::read(decoder));
let query_class = try!(DNSClass::read(decoder));
Ok(Query {
name: name,
query_type: query_type,
query_class: query_class,
})
}
fn emit(&self, encoder: &mut BinEncoder) -> EncodeResult {
try!(self.name.emit(encoder));
try!(self.query_type.emit(encoder));
try!(self.query_class.emit(encoder));
Ok(())
}
}
#[test]
fn test_read_and_emit() {
let expect = Query {
name: Name::from_labels(vec!["WWW", "example", "com"]),
query_type: RecordType::AAAA,
query_class: DNSClass::IN,
};
let mut byte_vec: Vec<u8> = Vec::with_capacity(512);
{
let mut encoder = BinEncoder::new(&mut byte_vec);
expect.emit(&mut encoder).unwrap();
}
let mut decoder = BinDecoder::new(&byte_vec);
let got = Query::read(&mut decoder).unwrap();
assert_eq!(got, expect);
}