1use 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}