// 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 crate::dyndns_service::DynDnsServiceConfiguration; use http::Method; use serde::{Deserialize, Serialize}; use serde_with::DisplayFromStr; use serde_with::serde_as; use crate::config::DnsRecordType; // See https://api.gandi.net/docs/livedns/ for more info #[serde_as] #[derive(Debug, Deserialize, PartialEq, Serialize)] pub struct Gandi { api_key: String, #[serde(default = "Gandi::default_method")] #[serde_as(as = "DisplayFromStr")] method: Method, #[serde(default = "Gandi::default_record_type")] record_type: DnsRecordType, } impl Gandi { pub fn new(api_key: String) -> Self { Self { api_key, method: Self::default_method(), record_type: Self::default_record_type(), } } fn default_method() -> Method { Method::PUT } fn default_record_type() -> DnsRecordType { DnsRecordType::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 = 'a', subdomain = 'b', record_type = self.record_type ) } } #[cfg(test)] mod tests { use serde_json::json; use super::*; #[test] fn check_defaults() { let input = json!({ "api_key": "SOME-API-KEY", }); let gandi = serde_json::from_value::(input).unwrap(); assert_eq!(gandi.record_type, DnsRecordType::A); assert_eq!(gandi.method, Method::PUT); } }