use serde::{Deserialize, Serialize};
use crate::common::{RdapEntity, RdapEvent, RdapLink, RdapRemark, RdapStatus, ResponseMeta};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DomainResponse {
pub query: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub ldh_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub unicode_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub handle: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub status: Vec<RdapStatus>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub nameservers: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub registrar: Option<RegistrarSummary>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub entities: Vec<RdapEntity>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub events: Vec<RdapEvent>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub links: Vec<RdapLink>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub remarks: Vec<RdapRemark>,
pub meta: ResponseMeta,
}
impl DomainResponse {
pub fn expiration_date(&self) -> Option<&str> {
self.events
.iter()
.find(|e| e.event_action == "expiration")
.map(|e| e.event_date.as_str())
}
pub fn registration_date(&self) -> Option<&str> {
self.events
.iter()
.find(|e| e.event_action == "registration")
.map(|e| e.event_date.as_str())
}
pub fn is_active(&self) -> bool {
self.status.iter().any(|s| matches!(s, RdapStatus::Active))
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RegistrarSummary {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub handle: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub abuse_email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub abuse_phone: Option<String>,
}