dnslib/dto/
record_request.rsuse chrono::Duration;
use hickory_proto::rr::rdata::{A, AAAA, CNAME, TXT};
use hickory_proto::rr::{Name, Record, RecordType};
use serde::{Deserialize, Serialize};
use std::str::FromStr;
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct RecordRequest {
pub domain: String,
pub name_labels: String,
pub new_name_labels: Option<String>,
pub zone: Option<String>,
pub rdata: RData,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct RData {
pub rdata_type: String,
pub rdata_content: Option<String>,
pub preference: Option<u16>,
pub txt: Option<Vec<String>>,
}
impl RecordRequest {
pub fn from_str(&self) -> RecordType {
let rr_type = match self.rdata.rdata_type.as_str() {
"A" => RecordType::A,
"AAAA" => RecordType::AAAA,
"MX" => RecordType::MX,
"CNAME" => RecordType::CNAME,
"TXT" => RecordType::TXT,
_ => RecordType::Unknown(0),
};
rr_type
}
pub fn to_record(&self) -> Record {
let rr_type = match self.rdata.rdata_type.as_str() {
"A" => RecordType::A,
"AAAA" => RecordType::AAAA,
"MX" => RecordType::MX,
"CNAME" => RecordType::CNAME,
"TXT" => RecordType::TXT,
_ => RecordType::Unknown(0),
};
let mut record = Record::with(
Name::from_str(self.name_labels.clone().as_str()).unwrap(),
rr_type,
Duration::hours(5).num_seconds() as u32,
);
match rr_type {
RecordType::A => {
record.set_data(Some(hickory_proto::rr::RData::A(
A::from_str(self.rdata.rdata_content.clone().unwrap().as_str()).unwrap(),
)));
}
RecordType::AAAA => {
record.set_data(Some(hickory_proto::rr::RData::AAAA(
AAAA::from_str(self.rdata.rdata_content.clone().unwrap().as_str()).unwrap(),
)));
}
RecordType::MX => {
record.set_data(Some(hickory_proto::rr::RData::MX(
hickory_proto::rr::rdata::MX::new(
self.rdata.preference.unwrap(),
Name::from_str(self.name_labels.clone().as_str()).unwrap(),
),
)));
}
RecordType::CNAME => {
record.set_data(Some(hickory_proto::rr::RData::CNAME(CNAME(
Name::from_str(self.rdata.rdata_content.clone().unwrap().as_str()).unwrap(),
))));
}
RecordType::TXT => {
record.set_data(Some(hickory_proto::rr::RData::TXT(TXT::new(
self.rdata.txt.clone().unwrap(),
))));
}
_ => {}
}
record
}
}