use super::domain::Domain;
use super::{ApiLinks, ApiMeta};
use super::{HasPagination, HasResponse, HasValue};
use crate::method::{Create, Delete, Get, List, Update};
use crate::request::{DomainRecordRequest, DomainRequest};
use crate::STATIC_URL_ERROR;
use getset::{Getters, Setters};
use serde::Serialize;
use std::fmt::Display;
use url::Url;
const DOMAIN_RECORDS_SEGMENT: &str = "records";
#[derive(Deserialize, Serialize, Debug, Clone, Getters, Setters)]
#[get = "pub"]
pub struct DomainRecord {
id: usize,
#[serde(rename = "type")]
kind: String,
name: String,
data: String,
priority: Option<usize>,
port: Option<usize>,
ttl: usize,
weight: Option<usize>
}
impl DomainRequest<Get, Domain> {
pub fn records(mut self) -> DomainRecordRequest<List, Vec<DomainRecord>> {
self.url_mut()
.path_segments_mut()
.expect(STATIC_URL_ERROR)
.push(DOMAIN_RECORDS_SEGMENT);
self.transmute()
}
}
impl DomainRecordRequest<List, Vec<DomainRecord>> {
pub fn create<S: AsRef<str> + Display + Serialize>(
mut self,
kind: S,
name: S,
data: S
) -> DomainRecordRequest<Create, DomainRecord> {
self.url_mut().path_segments_mut().expect(STATIC_URL_ERROR);
self.set_body(json!({
"type": kind,
"name": name,
"data": data
}));
self.transmute()
}
pub fn get(mut self, id: usize) -> DomainRecordRequest<Get, DomainRecord> {
self.url_mut()
.path_segments_mut()
.expect(STATIC_URL_ERROR)
.push(&id.to_string());
self.transmute()
}
pub fn update(mut self, id: usize) -> DomainRecordRequest<Update, DomainRecord> {
self.url_mut()
.path_segments_mut()
.expect(STATIC_URL_ERROR)
.push(&id.to_string());
self.transmute()
}
pub fn delete(mut self, id: usize) -> DomainRecordRequest<Delete, ()> {
self.url_mut()
.path_segments_mut()
.expect(STATIC_URL_ERROR)
.push(&id.to_string());
self.transmute()
}
}
impl DomainRecordRequest<Create, DomainRecord> {
pub fn priority(mut self, val: Option<usize>) -> Self {
self.body_mut()["priority"] = json!(val);
self
}
pub fn port(mut self, val: Option<usize>) -> Self {
self.body_mut()["port"] = json!(val);
self
}
pub fn ttl(mut self, val: usize) -> Self {
self.body_mut()["ttl"] = json!(val);
self
}
pub fn weight(mut self, val: Option<usize>) -> Self {
self.body_mut()["weight"] = json!(val);
self
}
}
impl DomainRecordRequest<Update, DomainRecord> {
pub fn kind<S: AsRef<str> + Display + Serialize>(mut self, val: S) -> Self {
self.body_mut()["type"] = json!(val);
self
}
pub fn name<S: AsRef<str> + Display + Serialize>(mut self, val: S) -> Self {
self.body_mut()["name"] = json!(val);
self
}
pub fn data<S: AsRef<str> + Display + Serialize>(mut self, val: S) -> Self {
self.body_mut()["data"] = json!(val);
self
}
pub fn priority(mut self, val: Option<usize>) -> Self {
self.body_mut()["priority"] = json!(val);
self
}
pub fn port(mut self, val: Option<usize>) -> Self {
self.body_mut()["port"] = json!(val);
self
}
pub fn ttl(mut self, val: usize) -> Self {
self.body_mut()["ttl"] = json!(val);
self
}
pub fn weight(mut self, val: Option<usize>) -> Self {
self.body_mut()["weight"] = json!(val);
self
}
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct DomainRecordResponse {
domain_record: DomainRecord
}
impl HasValue for DomainRecordResponse {
type Value = DomainRecord;
fn value(self) -> DomainRecord {
self.domain_record
}
}
impl HasResponse for DomainRecord {
type Response = DomainRecordResponse;
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct DomainRecordListResponse {
domain_records: Vec<DomainRecord>,
links: ApiLinks,
meta: ApiMeta
}
impl HasResponse for Vec<DomainRecord> {
type Response = DomainRecordListResponse;
}
impl HasPagination for DomainRecordListResponse {
fn next_page(&self) -> Option<Url> {
self.links.next()
}
}
impl HasValue for DomainRecordListResponse {
type Value = Vec<DomainRecord>;
fn value(self) -> Vec<DomainRecord> {
self.domain_records
}
}