aboutsummaryrefslogtreecommitdiff
path: root/src/dyndns_service/gandi.rs
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);
    }
}