use crate::endpoints::{account::Account, plan::Plan};
use crate::framework::{
endpoint::{Endpoint, Method},
response::ApiResult,
};
use crate::framework::{OrderDirection, SearchMatch};
use chrono::offset::Utc;
use chrono::DateTime;
pub struct ListZones {
pub params: ListZonesParams,
}
impl Endpoint<Vec<Zone>, ListZonesParams> for ListZones {
fn method(&self) -> Method {
Method::Get
}
fn path(&self) -> String {
"zones".to_string()
}
fn query(&self) -> Option<ListZonesParams> {
Some(self.params.clone())
}
}
pub struct ZoneDetails<'a> {
pub identifier: &'a str,
}
impl<'a> Endpoint<Zone> for ZoneDetails<'a> {
fn method(&self) -> Method {
Method::Get
}
fn path(&self) -> String {
format!("zones/{}", self.identifier)
}
}
#[derive(Serialize, Clone, Debug, Default)]
pub struct ListZonesParams {
pub name: Option<String>,
pub status: Option<Status>,
pub page: Option<u32>,
pub per_page: Option<u32>,
pub order: Option<ListZonesOrder>,
pub direction: Option<OrderDirection>,
#[serde(rename = "match")]
pub search_match: Option<SearchMatch>,
}
#[derive(Serialize, Clone, Debug)]
#[serde(rename_all = "lowercase")]
pub enum ListZonesOrder {
Name,
Status,
Email,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename = "status", rename_all = "lowercase")]
pub enum Status {
Active,
Pending,
Initializing,
Moved,
Deleted,
Deactivated,
}
#[derive(Deserialize, Debug)]
#[serde(rename_all = "lowercase", tag = "type")]
pub enum Owner {
User { id: String, email: String },
Organization { id: String, name: String },
}
#[derive(Deserialize, Debug)]
#[serde(rename_all = "lowercase")]
pub enum Type {
Full,
Partial,
}
#[derive(Deserialize, Debug)]
pub struct HostingPartner {
pub name: String,
pub website: String,
}
#[derive(Deserialize, Debug)]
pub struct Meta {
pub custom_certificate_quota: u32,
pub page_rule_quota: u32,
pub wildcard_proxiable: bool,
pub phishing_detected: bool,
pub multiple_railguns_allowed: bool,
}
#[derive(Deserialize, Debug)]
pub struct Zone {
pub id: String,
pub name: String,
pub account: Account,
pub betas: Option<Vec<String>>,
pub created_on: DateTime<Utc>,
pub deactivation_reason: Option<String>,
pub development_mode: i32,
pub host: Option<HostingPartner>,
pub meta: Meta,
pub modified_on: DateTime<Utc>,
pub name_servers: Vec<String>,
pub original_dnshost: Option<String>,
pub original_name_servers: Option<Vec<String>>,
pub original_registrar: Option<String>,
pub owner: Owner,
pub paused: bool,
pub permissions: Vec<String>,
pub plan: Option<Plan>,
pub plan_pending: Option<Plan>,
pub status: Status,
#[serde(rename = "type")]
pub zone_type: Type,
}
impl ApiResult for Zone {}
impl ApiResult for Vec<Zone> {}