epp_client/extensions/
namestore.rs1use 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
26impl 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
34impl 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
44impl 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 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 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)]
86pub struct NameStoreData<'a> {
88 #[serde(rename = "xmlns:namestoreExt", alias = "xmlns")]
90 pub xmlns: Cow<'a, str>,
91 #[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}