blob: 72c95adbd14ceac315cf95cb0beb189e7222e5ea (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
// 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::<Gandi>("{ \"domain\":\"mydomain.com\", \"subdomain\":\"dyn\" }").unwrap();
assert_eq!(gandi.record_type, RecordType::A);
assert_eq!(gandi.method, Method::PUT);
}
}
|