use std::net::UdpSocket;
use std::str::FromStr;
use domain::base::opt::AllOptData;
use domain::base::{
Message, MessageBuilder, Name, Rtype, StaticCompressor, StreamTarget,
};
use domain::rdata::AllRecordData;
fn create_message() -> StreamTarget<Vec<u8>> {
let mut msg = MessageBuilder::from_target(StaticCompressor::new(
StreamTarget::new_vec(),
))
.unwrap();
msg.header_mut().set_rd(true);
msg.header_mut().set_random_id();
let mut msg = msg.question();
msg.push((Name::<Vec<u8>>::from_str("example.com.").unwrap(), Rtype::A))
.unwrap();
let mut msg = msg.additional();
msg.opt(|opt| {
opt.set_udp_payload_size(4096);
Ok(())
})
.unwrap();
msg.finish().into_target()
}
fn main() {
let socket =
UdpSocket::bind("0.0.0.0:0").expect("couldn't bind to address");
let message = create_message();
let server: String = "127.0.0.1".to_string();
let port: u16 = 53;
socket
.send_to(message.as_dgram_slice(), (server, port))
.unwrap();
let mut buffer = vec![0; 1232];
socket.recv_from(&mut buffer).unwrap();
let response = Message::from_octets(buffer).unwrap();
for question in response.question() {
println!("{}", question.unwrap());
}
for record in response.answer().unwrap().limit_to::<AllRecordData<_, _>>()
{
println!("{}", record.unwrap());
}
for record in response
.authority()
.unwrap()
.limit_to::<AllRecordData<_, _>>()
{
println!("{}", record.unwrap());
}
for option in response.opt().unwrap().opt().iter::<AllOptData<_, _>>() {
let opt = option.unwrap();
match opt {
AllOptData::Nsid(nsid) => println!("{nsid}"),
AllOptData::ExtendedError(extendederror) => {
println!("{extendederror}")
}
_ => println!("NO OPT!"),
}
}
}