epp_client/extensions/
namestore.rs

1//! Types for EPP namestore request and responses
2
3use std::borrow::Cow;
4
5use serde::{Deserialize, Serialize};
6
7use crate::{
8    common::StringValue,
9    contact::{
10        check::ContactCheck, create::ContactCreate, delete::ContactDelete, info::ContactInfo,
11        update::ContactUpdate,
12    },
13    domain::{
14        check::DomainCheck, create::DomainCreate, delete::DomainDelete, info::DomainInfo,
15        renew::DomainRenew, transfer::DomainTransfer, update::DomainUpdate,
16    },
17    host::{
18        check::HostCheck, create::HostCreate, delete::HostDelete, info::HostInfo,
19        update::HostUpdate,
20    },
21    request::{Extension, Transaction},
22};
23
24pub const XMLNS: &str = "http://www.verisign-grs.com/epp/namestoreExt-1.1";
25
26// Contact
27
28impl Transaction<NameStore<'_>> for ContactCheck<'_> {}
29impl Transaction<NameStore<'_>> for ContactCreate<'_> {}
30impl Transaction<NameStore<'_>> for ContactDelete<'_> {}
31impl Transaction<NameStore<'_>> for ContactInfo<'_> {}
32impl Transaction<NameStore<'_>> for ContactUpdate<'_> {}
33
34// Domain
35
36impl Transaction<NameStore<'_>> for DomainCheck<'_> {}
37impl Transaction<NameStore<'_>> for DomainCreate<'_> {}
38impl Transaction<NameStore<'_>> for DomainDelete<'_> {}
39impl Transaction<NameStore<'_>> for DomainInfo<'_> {}
40impl Transaction<NameStore<'_>> for DomainRenew<'_> {}
41impl Transaction<NameStore<'_>> for DomainTransfer<'_> {}
42impl Transaction<NameStore<'_>> for DomainUpdate<'_> {}
43
44// Host
45
46impl Transaction<NameStore<'_>> for HostCheck<'_> {}
47impl Transaction<NameStore<'_>> for HostCreate<'_> {}
48impl Transaction<NameStore<'_>> for HostDelete<'_> {}
49impl Transaction<NameStore<'_>> for HostInfo<'_> {}
50impl Transaction<NameStore<'_>> for HostUpdate<'_> {}
51
52impl<'a> NameStore<'a> {
53    /// Create a new RGP restore report request
54    pub fn new(subproduct: &str) -> NameStore {
55        NameStore {
56            data: NameStoreData {
57                xmlns: XMLNS.into(),
58                subproduct: subproduct.to_owned().into(),
59            },
60        }
61    }
62}
63
64impl<'a> NameStoreData<'a> {
65    /// Create a new RGP restore report request
66    pub fn new(subproduct: &str) -> Self {
67        Self {
68            xmlns: XMLNS.into(),
69            subproduct: subproduct.to_owned().into(),
70        }
71    }
72}
73
74impl<'a> Extension for NameStore<'a> {
75    type Response = NameStore<'static>;
76}
77
78#[derive(Debug, Deserialize, Serialize)]
79#[serde(rename = "namestoreExt:namestoreExt")]
80pub struct NameStore<'a> {
81    #[serde(rename = "namestoreExt:namestoreExt", alias = "namestoreExt")]
82    pub data: NameStoreData<'a>,
83}
84
85#[derive(Serialize, Deserialize, Debug)]
86/// Type for EPP XML &lt;namestoreExt&gt; extension
87pub struct NameStoreData<'a> {
88    /// XML namespace for the RGP restore extension
89    #[serde(rename = "xmlns:namestoreExt", alias = "xmlns")]
90    pub xmlns: Cow<'a, str>,
91    /// The object holding the list of domains to be checked
92    #[serde(rename = "namestoreExt:subProduct", alias = "subProduct")]
93    pub subproduct: StringValue<'a>,
94}
95
96#[cfg(test)]
97mod tests {
98    use super::NameStore;
99    use crate::domain::check::DomainCheck;
100    use crate::tests::{assert_serialized, response_from_file_with_ext};
101
102    #[test]
103    fn command() {
104        let namestore_ext = NameStore::new("com");
105
106        let object = DomainCheck {
107            domains: &["example1.com", "example2.com", "example3.com"],
108        };
109
110        assert_serialized(
111            "request/extensions/namestore.xml",
112            (&object, &namestore_ext),
113        );
114    }
115
116    #[test]
117    fn response() {
118        let object = response_from_file_with_ext::<DomainCheck, NameStore>(
119            "response/extensions/namestore.xml",
120        );
121        let ext = object.extension.unwrap();
122        assert_eq!(ext.data.subproduct, "com".into());
123    }
124}