Skip to main content

cli_engine/output/
json.rs

1use crate::Result;
2
3use super::Envelope;
4
5/// Renders an envelope as pretty JSON.
6///
7/// HTML-sensitive characters are escaped so the output is safe to embed in
8/// browser-oriented logs or diagnostics without changing the JSON data model.
9pub fn render_json(envelope: &Envelope) -> Result<String> {
10    envelope.serialization_result()?;
11    let mut rendered = serde_json::to_string_pretty(envelope)?;
12    rendered = escape_html_sensitive_json_chars(&rendered);
13    rendered.push('\n');
14    Ok(rendered)
15}
16
17fn escape_html_sensitive_json_chars(json: &str) -> String {
18    let mut escaped = String::with_capacity(json.len());
19    for character in json.chars() {
20        match character {
21            '<' => escaped.push_str("\\u003c"),
22            '>' => escaped.push_str("\\u003e"),
23            '&' => escaped.push_str("\\u0026"),
24            '\u{2028}' => escaped.push_str("\\u2028"),
25            '\u{2029}' => escaped.push_str("\\u2029"),
26            _ => escaped.push(character),
27        }
28    }
29    escaped
30}