use std::collections::HashMap;
mod sealed {
pub trait Sealed {}
}
impl sealed::Sealed for str {}
impl sealed::Sealed for String {}
pub trait ReplaceMultiple: sealed::Sealed {
fn replace_multiple(
&self,
replacements: HashMap<char, &str>,
) -> String;
}
impl ReplaceMultiple for str {
fn replace_multiple(
&self,
replacements: HashMap<char, &str>,
) -> String {
let mut new_str = String::new();
for char in self.chars() {
match replacements.get(&char) {
Some(repl) => new_str.push_str(repl),
None => new_str.push(char),
}
}
new_str
}
}
impl ReplaceMultiple for String {
fn replace_multiple(
&self,
replacements: HashMap<char, &str>,
) -> String {
self.as_str().replace_multiple(replacements)
}
}
pub trait SanitizeXml: sealed::Sealed {
fn sanitize_xml(&self) -> String;
}
impl<T: ReplaceMultiple> SanitizeXml for T {
fn sanitize_xml(&self) -> String {
self.replace_multiple(
vec![('&', "&"), ('<', "<"), ('>', ">"), ('"', """), ('\'', "'")]
.into_iter()
.collect::<HashMap<char, &str>>(),
)
}
}