instant_epp/domain/
check.rs

1//! Types for EPP domain check request
2
3use std::fmt;
4
5use instant_xml::{FromXml, Serializer, ToXml};
6
7use super::XMLNS;
8use crate::common::{NoExtension, EPP_XMLNS};
9use crate::request::{Command, Transaction};
10
11impl<'a> Transaction<NoExtension> for DomainCheck<'a> {}
12
13impl<'a> Command for DomainCheck<'a> {
14    type Response = CheckData;
15    const COMMAND: &'static str = "check";
16}
17
18// Request
19
20#[derive(Debug, ToXml)]
21#[xml(rename = "check", ns(XMLNS))]
22struct DomainList<'a> {
23    #[xml(rename = "name", ns(XMLNS))]
24    domains: &'a [&'a str],
25}
26
27fn serialize_domains<W: fmt::Write + ?Sized>(
28    domains: &[&str],
29    serializer: &mut Serializer<W>,
30) -> Result<(), instant_xml::Error> {
31    DomainList { domains }.serialize(None, serializer)
32}
33
34#[derive(ToXml, Debug)]
35#[xml(rename = "check", ns(EPP_XMLNS))]
36pub struct DomainCheck<'a> {
37    /// The list of domains to be checked for availability
38    #[xml(serialize_with = "serialize_domains")]
39    pub domains: &'a [&'a str],
40}
41
42// Response
43
44#[derive(Debug, FromXml)]
45#[xml(rename = "name", ns(XMLNS))]
46pub struct Checked {
47    #[xml(attribute, rename = "avail")]
48    pub available: bool,
49    #[xml(attribute)]
50    pub reason: Option<String>,
51    #[xml(direct)]
52    pub id: String,
53}
54
55#[derive(Debug, FromXml)]
56#[xml(rename = "cd", ns(XMLNS))]
57pub struct CheckedDomain {
58    /// Data under the `<cd>` tag
59    #[xml(rename = "cd")]
60    pub inner: Checked,
61}
62
63/// Type that represents the `<chkData>` tag for host check response
64#[derive(Debug, FromXml)]
65#[xml(rename = "chkData", ns(XMLNS))]
66pub struct CheckData {
67    pub list: Vec<CheckedDomain>,
68}
69
70#[cfg(test)]
71mod tests {
72    use super::DomainCheck;
73    use crate::response::ResultCode;
74    use crate::tests::{assert_serialized, response_from_file, CLTRID, SUCCESS_MSG, SVTRID};
75
76    #[test]
77    fn command() {
78        let object = DomainCheck {
79            domains: &["eppdev.com", "eppdev.net"],
80        };
81        assert_serialized("request/domain/check.xml", &object);
82    }
83
84    #[test]
85    fn response() {
86        let object = response_from_file::<DomainCheck>("response/domain/check.xml");
87        let result = dbg!(&object).res_data().unwrap();
88
89        assert_eq!(object.result.code, ResultCode::CommandCompletedSuccessfully);
90        assert_eq!(object.result.message, SUCCESS_MSG);
91        assert_eq!(result.list[0].inner.id, "eppdev.com");
92        assert!(result.list[0].inner.available);
93        assert_eq!(result.list[1].inner.id, "eppdev.net");
94        assert!(!result.list[1].inner.available);
95        assert_eq!(object.tr_ids.client_tr_id.unwrap(), CLTRID);
96        assert_eq!(object.tr_ids.server_tr_id, SVTRID);
97    }
98}