use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Deserialize)]
#[serde(bound(deserialize = "T: Deserialize<'de>"))]
pub struct TechnitiumApiEnvelope<T> {
#[serde(default)]
pub status: Option<String>,
#[serde(default)]
pub response: Option<T>,
#[serde(rename = "errorMessage", alias = "error_message", default)]
pub error_message: Option<String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct TechnitiumSession {
#[serde(
rename = "token",
alias = "sessionToken",
alias = "session_token",
default
)]
pub token: Option<String>,
#[serde(default)]
pub user: Option<String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct TechnitiumServerStatus {
#[serde(default)]
pub version: Option<String>,
#[serde(default)]
pub uptime: Option<Value>,
#[serde(default)]
pub dns_server_domain: Option<String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct TechnitiumZoneSummary {
#[serde(rename = "name", alias = "zone", alias = "domain", default)]
pub name: Option<String>,
#[serde(rename = "type", alias = "zoneType", alias = "zone_type", default)]
pub zone_type: Option<String>,
#[serde(default)]
pub disabled: Option<bool>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum TechnitiumRecordType {
A,
AAAA,
CNAME,
MX,
TXT,
NS,
SRV,
CAA,
PTR,
}
impl TechnitiumRecordType {
pub const fn as_str(self) -> &'static str {
match self {
Self::A => "A",
Self::AAAA => "AAAA",
Self::CNAME => "CNAME",
Self::MX => "MX",
Self::TXT => "TXT",
Self::NS => "NS",
Self::SRV => "SRV",
Self::CAA => "CAA",
Self::PTR => "PTR",
}
}
}
impl std::fmt::Display for TechnitiumRecordType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.as_str())
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TechnitiumDnsRecord {
pub name: String,
#[serde(rename = "type")]
pub record_type: TechnitiumRecordType,
#[serde(default)]
pub ttl: Option<u32>,
#[serde(default)]
pub value: Option<String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}