use std::fmt::{self, Write};
use std::marker::PhantomData;
use hyper::method::Method;
use serde_json;
use response;
use request::RequestBuilder;
use request::DoRequest;
doapi_enum! {
#[derive(Debug)]
pub enum DnsRecType {
A,
AAAA,
CNAME,
MX,
NS,
SRV,
TXT
}
}
#[derive(Serialize)]
pub struct DnsRecord {
#[serde(rename = "type")]
pub rec_type: Option<String>,
pub name: Option<String>,
pub priority: Option<u64>,
pub port: Option<u64>,
pub data: Option<String>,
pub weight: Option<u64>,
}
impl fmt::Display for DnsRecord {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f,
"Record Type: {}\n\
Name: {}\n\
Data: {}\n\
Priority: {}\n\
Port: {}\n\
Weight: {}\n",
if let Some(t) = self.rec_type.clone() {
t
} else {
"None".to_owned()
},
if let Some(n) = self.name.clone() {
n
} else {
"None".to_owned()
},
if let Some(d) = self.data.clone() {
d
} else {
"None".to_owned()
},
if let Some(p) = self.priority {
p.to_string()
} else {
"None".to_owned()
},
if let Some(p) = self.port {
p.to_string()
} else {
"None".to_owned()
},
if let Some(w) = self.weight {
w.to_string()
} else {
"None".to_owned()
})
}
}
impl<'t> RequestBuilder<'t, response::DnsRecords> {
pub fn create(self, record: &DnsRecord) -> RequestBuilder<'t, response::DnsRecord> {
RequestBuilder {
method: Method::Post,
auth: self.auth,
url: self.url,
resp_t: PhantomData,
body: Some(serde_json::to_string(record).ok().unwrap()),
}
}
}
impl<'t> RequestBuilder<'t, response::DnsRecord> {
pub fn update(self, record: &DnsRecord) -> RequestBuilder<'t, response::DnsRecord> {
let mut s = String::new();
write!(s,
"{{{}{}{}{}{}{}}}",
if let Some(t) = record.rec_type.clone() {
format!("\"type\":{:?},", t)
} else {
"".to_owned()
},
if let Some(n) = record.name.clone() {
format!("\"name\":{:?},", n)
} else {
"".to_owned()
},
if let Some(d) = record.data.clone() {
format!("\"data\":{:?},", d)
} else {
"".to_owned()
},
if let Some(p) = record.priority {
format!("\"priority\":{},", p)
} else {
"".to_owned()
},
if let Some(p) = record.port {
format!("\"port\":{},", p)
} else {
"".to_owned()
},
if let Some(w) = record.weight {
format!("\"weight\":{}", w)
} else {
"".to_owned()
})
.unwrap();
RequestBuilder {
method: Method::Put,
auth: self.auth,
url: self.url,
resp_t: PhantomData,
body: Some(s),
}
}
pub fn delete(self) -> RequestBuilder<'t, response::HeaderOnly> {
RequestBuilder {
method: Method::Delete,
auth: self.auth,
url: self.url,
resp_t: PhantomData,
body: None,
}
}
}
impl<'t> DoRequest<response::DnsRecord> for RequestBuilder<'t, response::DnsRecord> {}