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