#![allow(unused)]
use std::str::FromStr;
use chrono::DateTime;
use chrono::NaiveDate;
use chrono::TimeZone;
use chrono::Utc;
use literal_enum::LiteralEnum;
use serde::Deserialize;
use serde::Serialize;
pub(crate) type String = std::string::String;
pub(crate) type Date = std::string::String; pub(crate) type Timestamp = std::string::String; pub(crate) type Integer = u64;
pub(crate) type Boolean = bool;
pub(crate) type Float = f32;
pub(crate) type Double = f32;
pub(crate) type Binary = Vec<u8>;
#[derive(Debug, Clone, LiteralEnum, Serialize, Deserialize)]
#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
pub enum ContentType {
#[lit = "application/json; charset=utf-8"]
#[serde(rename = "application/json; charset=utf-8")]
#[cfg_attr(feature = "clap", clap(name = "application/json; charset=utf-8"))]
JSON,
}
#[derive(Debug, Clone, LiteralEnum, Serialize, Deserialize)]
#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
pub enum Language {
#[lit = "en-US"]
#[serde(rename = "en-US")]
#[cfg_attr(feature = "clap", clap(name = "en-US"))]
EnUS,
#[lit = "zh-CN"]
#[serde(rename = "zh-CN")]
#[cfg_attr(feature = "clap", clap(name = "zh-CN"))]
ZhCN,
}
#[derive(Debug, Default, Clone, LiteralEnum, Serialize, Deserialize)]
#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
pub enum Version {
#[default]
#[lit = "2021-03-23"]
#[serde(rename = "2021-03-23")]
#[cfg_attr(feature = "clap", clap(name = "2021-03-23"))]
Version2021_03_23,
}
#[derive(Debug, Clone, LiteralEnum, Serialize, Deserialize)]
#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
pub enum Region {}
#[derive(Debug, Default, Clone, LiteralEnum, Serialize, Deserialize)]
#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
pub enum RecordType {
#[default]
#[cfg_attr(feature = "clap", clap(rename_all = "UPPER"))]
A,
#[cfg_attr(feature = "clap", clap(rename_all = "UPPER"))]
CNAME,
#[cfg_attr(feature = "clap", clap(rename_all = "UPPER"))]
MX,
#[cfg_attr(feature = "clap", clap(rename_all = "UPPER"))]
TXT,
#[cfg_attr(feature = "clap", clap(rename_all = "UPPER"))]
AAAA,
#[cfg_attr(feature = "clap", clap(rename_all = "UPPER"))]
NS,
#[cfg_attr(feature = "clap", clap(rename_all = "UPPER"))]
CAA,
#[cfg_attr(feature = "clap", clap(rename_all = "UPPER"))]
SRV,
#[cfg_attr(feature = "clap", clap(rename_all = "UPPER"))]
HTTPS,
#[cfg_attr(feature = "clap", clap(rename_all = "UPPER"))]
SVCB,
#[cfg_attr(feature = "clap", clap(rename_all = "UPPER"))]
SPF,
#[cfg_attr(feature = "clap", clap(name = "显性URL"))]
显性URL,
#[cfg_attr(feature = "clap", clap(name = "隐性URL"))]
隐性URL,
}
#[derive(Debug, Clone, Default, LiteralEnum, Serialize, Deserialize)]
#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
pub enum RecordLine {
#[default]
#[cfg_attr(feature = "clap", clap(name = "默认"))]
默认,
}
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, Default, LiteralEnum, Serialize, Deserialize)]
#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
pub enum DomainType {
#[default]
#[cfg_attr(feature = "clap", clap(rename_all = "UPPER"))]
ALL,
#[cfg_attr(feature = "clap", clap(rename_all = "UPPER"))]
MINE,
#[cfg_attr(feature = "clap", clap(rename_all = "UPPER"))]
SHARE,
#[cfg_attr(feature = "clap", clap(rename_all = "UPPER"))]
ISMARK,
#[cfg_attr(feature = "clap", clap(rename_all = "UPPER"))]
PAUSE,
#[cfg_attr(feature = "clap", clap(rename_all = "UPPER"))]
VIP,
#[cfg_attr(feature = "clap", clap(rename_all = "UPPER"))]
RECENT,
#[cfg_attr(feature = "clap", clap(rename_all = "UPPER"))]
SHARE_OUT,
#[cfg_attr(feature = "clap", clap(rename_all = "UPPER"))]
FREE,
}
#[derive(Debug, Clone)]
pub struct DnsPodDate {
pub date: Option<NaiveDate>,
}
impl Serialize for DnsPodDate {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
if let Some(ref date) = self.date {
let s = date.to_string();
serializer.serialize_str(&s)
} else {
serializer.serialize_str("0000-00-00")
}
}
}
impl<'de> Deserialize<'de> for DnsPodDate {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
match NaiveDate::from_str(&s) {
Ok(date) => Ok(Self { date: Some(date) }),
Err(_) => Ok(Self { date: None }),
}
}
}
#[derive(Debug, Clone)]
pub struct DnsPodTimestamp {
pub datetime: Option<DateTime<Utc>>,
}
impl DnsPodTimestamp {
const FORMAT: &'static str = "%Y-%m-%d %H:%M:%S";
}
impl Serialize for DnsPodTimestamp {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
if let Some(ref datetime) = self.datetime {
let s = format!("{}", datetime.format(Self::FORMAT));
serializer.serialize_str(&s)
} else {
serializer.serialize_str("0000-00-00 00:00:00")
}
}
}
impl<'de> Deserialize<'de> for DnsPodTimestamp {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
match Utc.datetime_from_str(&s, Self::FORMAT) {
Ok(datetime) => Ok(Self {
datetime: Some(datetime),
}),
Err(_) => Ok(Self { datetime: None }),
}
}
}
#[test]
fn test() {
let s = "\"0000-01-01 00:00:00\"";
let t: Timestamp = serde_json::from_str(s).unwrap();
let s = serde_json::to_string_pretty(&t).unwrap();
println!("t: {:?}", t);
println!("s: {:?}", s);
let s = "\"2023-09-03\"";
let d: Date = serde_json::from_str(s).unwrap();
let s = serde_json::to_string_pretty(&d).unwrap();
println!("d: {:?}", d);
println!("s: {:?}", s);
}