use serde::Serialize;
use crate::{escape_into, json};
pub fn state_script_into(out: &mut String, id: &str, state: &impl Serialize) {
out.push_str("<script type=\"application/json\" id=\"");
escape_into(out, id);
out.push_str("\">");
let json = json::to_string(state);
json_escaped_into(out, &json);
out.push_str("</script>");
}
pub(crate) fn json_escaped_into(out: &mut String, json: &str) {
out.reserve(json.len());
let bytes = json.as_bytes();
let (mut last, mut i) = (0, 0);
while i < bytes.len() {
let (rep, width) = match bytes[i] {
b'<' => ("\\u003c", 1),
b'>' => ("\\u003e", 1),
b'&' => ("\\u0026", 1),
0xE2 if bytes.get(i + 1) == Some(&0x80) && bytes.get(i + 2) == Some(&0xA8) => {
("\\u2028", 3)
}
0xE2 if bytes.get(i + 1) == Some(&0x80) && bytes.get(i + 2) == Some(&0xA9) => {
("\\u2029", 3)
}
_ => {
i += 1;
continue;
}
};
out.push_str(&json[last..i]);
out.push_str(rep);
i += width;
last = i;
}
out.push_str(&json[last..]);
}
#[cfg(test)]
mod tests;