instant_epp/extensions/
namestore.rs

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