Skip to main content

epp_client/domain/
check.rs

1//! Types for EPP domain check request
2
3use super::XMLNS;
4use crate::common::{CheckResponse, NoExtension, StringValue};
5use crate::request::{Command, Transaction};
6use serde::Serialize;
7
8impl<'a> Transaction<NoExtension> for DomainCheck<'a> {}
9
10impl<'a> Command for DomainCheck<'a> {
11    type Response = CheckResponse;
12    const COMMAND: &'static str = "check";
13}
14
15// Request
16
17/// Type for &lt;name&gt; elements under the domain &lt;check&gt; tag
18#[derive(Serialize, Debug)]
19struct DomainList<'a> {
20    #[serde(rename = "xmlns:domain")]
21    /// XML namespace for domain commands
22    xmlns: &'a str,
23    #[serde(rename = "domain:name")]
24    /// List of domains to be checked for availability
25    domains: Vec<StringValue<'a>>,
26}
27
28#[derive(Serialize, Debug)]
29struct SerializeDomainCheck<'a> {
30    #[serde(rename = "domain:check")]
31    list: DomainList<'a>,
32}
33
34impl<'a> From<DomainCheck<'a>> for SerializeDomainCheck<'a> {
35    fn from(check: DomainCheck<'a>) -> Self {
36        Self {
37            list: DomainList {
38                xmlns: XMLNS,
39                domains: check.domains.iter().map(|&d| d.into()).collect(),
40            },
41        }
42    }
43}
44
45/// The EPP `check` command for domains
46#[derive(Clone, Debug, Serialize)]
47#[serde(into = "SerializeDomainCheck")]
48pub struct DomainCheck<'a> {
49    /// The list of domains to be checked
50    pub domains: &'a [&'a str],
51}
52
53#[cfg(test)]
54mod tests {
55    use super::DomainCheck;
56    use crate::response::ResultCode;
57    use crate::tests::{assert_serialized, response_from_file, CLTRID, SUCCESS_MSG, SVTRID};
58
59    #[test]
60    fn command() {
61        let object = DomainCheck {
62            domains: &["eppdev.com", "eppdev.net"],
63        };
64        assert_serialized("request/domain/check.xml", &object);
65    }
66
67    #[test]
68    fn response() {
69        let object = response_from_file::<DomainCheck>("response/domain/check.xml");
70        let result = object.res_data().unwrap();
71
72        assert_eq!(object.result.code, ResultCode::CommandCompletedSuccessfully);
73        assert_eq!(object.result.message, SUCCESS_MSG.into());
74        assert_eq!(result.list[0].id, "eppdev.com");
75        assert!(result.list[0].available);
76        assert_eq!(result.list[1].id, "eppdev.net");
77        assert!(!result.list[1].available);
78        assert_eq!(object.tr_ids.client_tr_id.unwrap(), CLTRID.into());
79        assert_eq!(object.tr_ids.server_tr_id, SVTRID.into());
80    }
81}