// curl --request PUT \ // --url https://api.gandi.net/api/v5/domains/example.net/records/mybox/A \ // --header "authorization: Apikey ${API_KEY}" \ // --header 'content-type: application/json' \ // --data "{ \"rrset_ttl\": 300, \"rrset_values\": [\"1.2.3.4\"] }" use serde_with::DisplayFromStr; use serde_with::TryFromInto; use serde_with::serde_as; use http::Method; use trust_dns_client::rr::RecordType; use serde::Deserialize; use crate::dyndns_service::DynDnsServiceConfiguration; // See https://api.gandi.net/docs/livedns/ for more info const API_URL_TEMPLATE: &str = "https://api.gandi.net/api/v5/domains/{domain}/records/{subdomain}/{record_type}"; #[serde_as] #[derive(Debug, Deserialize)] struct Gandi { domain: String, subdomain: String, #[serde(default = "Gandi::default_method")] #[serde_as(as = "DisplayFromStr")] method: Method, #[serde(default = "Gandi::default_record_type")] #[serde_as(as = "DisplayFromStr")] record_type: RecordType, } impl Gandi { fn default_method() -> Method { Method::PUT } fn default_record_type() -> RecordType { RecordType::A } } impl DynDnsServiceConfiguration for Gandi { fn get_service_url(&self) -> String { format!("https://api.gandi.net/api/v5/domains/{domain}/records/{subdomain}/{record_type}", domain = self.domain, subdomain = self.subdomain, record_type = self.record_type) } } #[cfg(test)] mod tests { use super::*; #[test] fn check_defaults() { let gandi = serde_json::from_str::("{ \"domain\":\"mydomain.com\", \"subdomain\":\"dyn\" }").unwrap(); assert_eq!(gandi.record_type, RecordType::A); assert_eq!(gandi.method, Method::PUT); } }