1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//! Types to use in serialization to and deserialization from EPP XML

use instant_xml::{FromXml, FromXmlOwned, ToXml};

use crate::common::EPP_XMLNS;
use crate::error::Error;

pub const EPP_XML_HEADER: &str = r#"<?xml version="1.0" encoding="UTF-8" standalone="no"?>"#;

pub(crate) fn serialize(data: impl ToXml) -> Result<String, Error> {
    Ok(format!(
        "{}\r\n{}",
        EPP_XML_HEADER,
        instant_xml::to_string(&Epp { data }).map_err(|e| Error::Xml(e.into()))?
    ))
}

pub(crate) fn deserialize<T: FromXmlOwned>(xml: &str) -> Result<T, Error> {
    match instant_xml::from_str::<Epp<T>>(xml) {
        Ok(Epp { data }) => Ok(data),
        Err(e) => Err(Error::Xml(e.into())),
    }
}

#[derive(FromXml, ToXml)]
#[xml(rename = "epp", ns(EPP_XMLNS))]
pub(crate) struct Epp<T> {
    pub(crate) data: T,
}