use std::borrow::Cow;
use crate::encode::OutputEncoder;
#[derive(Clone, Copy, Debug, Default)]
pub struct XmlEncoder;
fn needs_xml_encoding(c: char) -> bool {
matches!(c, '<' | '>' | '&' | '"' | '\'' | '\0')
}
impl OutputEncoder for XmlEncoder {
fn encode<'a>(&self, input: &'a str) -> Cow<'a, str> {
if !input.chars().any(needs_xml_encoding) {
return Cow::Borrowed(input);
}
let mut out = String::with_capacity(input.len() + 16);
for c in input.chars() {
match c {
'<' => out.push_str("<"),
'>' => out.push_str(">"),
'&' => out.push_str("&"),
'"' => out.push_str("""),
'\'' => out.push_str("'"),
'\0' => {} _ => out.push(c),
}
}
Cow::Owned(out)
}
}
#[must_use]
pub fn encode(input: &str) -> Cow<'_, str> {
XmlEncoder.encode(input)
}