instant_epp/
xml.rs

1//! Types to use in serialization to and deserialization from EPP XML
2
3use instant_xml::{FromXml, FromXmlOwned, ToXml};
4
5use crate::common::EPP_XMLNS;
6use crate::error::Error;
7
8pub const EPP_XML_HEADER: &str = r#"<?xml version="1.0" encoding="UTF-8" standalone="no"?>"#;
9
10pub(crate) fn serialize(data: impl ToXml) -> Result<String, Error> {
11    Ok(format!(
12        "{}\r\n{}",
13        EPP_XML_HEADER,
14        instant_xml::to_string(&Epp { data }).map_err(|e| Error::Xml(e.into()))?
15    ))
16}
17
18pub(crate) fn deserialize<T: FromXmlOwned>(xml: &str) -> Result<T, Error> {
19    match instant_xml::from_str::<Epp<T>>(xml) {
20        Ok(Epp { data }) => Ok(data),
21        Err(e) => Err(Error::Xml(e.into())),
22    }
23}
24
25#[derive(FromXml, ToXml)]
26#[xml(rename = "epp", ns(EPP_XMLNS))]
27pub(crate) struct Epp<T> {
28    pub(crate) data: T,
29}