dxr/
xml.rs

1use quick_xml::de::DeError;
2use quick_xml::se::{QuoteLevel, SeError, Serializer};
3
4use serde::{Deserialize, Serialize};
5
6/// Custom function for serializing values as XML.
7///
8/// This function uses a custom [`Serializer`] that expands empty XML elements
9/// (for example, `<value><string></string></value>` for an empty string value)
10/// instead of using self-closing XML tags, which are not accepted by all XML-RPC
11/// implementations.
12///
13/// This should be a drop-in replacement for [`quick_xml::se::to_string`].
14pub fn serialize_xml<T>(value: &T) -> Result<String, SeError>
15where
16    T: Serialize,
17{
18    let mut buf = String::new();
19
20    // initialize custom serializer that expands empty elements
21    let mut serializer = Serializer::new(&mut buf);
22    serializer.expand_empty_elements(true);
23    serializer.set_quote_level(QuoteLevel::Full);
24
25    value.serialize(serializer)?;
26    Ok(buf)
27}
28
29/// Function for deserializing values from XML.
30///
31/// This is a wrapper around [`quick_xml::de::from_str`].
32pub fn deserialize_xml<'de, T>(string: &'de str) -> Result<T, DeError>
33where
34    T: Deserialize<'de>,
35{
36    quick_xml::de::from_str(string)
37}