use std::borrow::Cow;
use crate::encode::OutputEncoder;
#[derive(Clone, Copy, Debug, Default)]
pub struct HtmlEncoder;
fn needs_html_encoding(c: char) -> bool {
matches!(c, '<' | '>' | '&' | '"' | '\'' | '/' | '\0')
}
impl OutputEncoder for HtmlEncoder {
fn encode<'a>(&self, input: &'a str) -> Cow<'a, str> {
if !input.chars().any(needs_html_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("'"),
'/' => out.push_str("/"),
'\0' => {} _ => out.push(c),
}
}
Cow::Owned(out)
}
}
#[must_use]
pub fn encode(input: &str) -> Cow<'_, str> {
HtmlEncoder.encode(input)
}