use std::fmt::Write as _;
pub fn json_string(s: &str) -> String {
let mut out = String::with_capacity(s.len() + 2);
out.push('"');
for c in s.chars() {
match c {
'"' => out.push_str("\\\""),
'\\' => out.push_str("\\\\"),
'\n' => out.push_str("\\n"),
'\r' => out.push_str("\\r"),
'\t' => out.push_str("\\t"),
c if (c as u32) < 0x20 => {
let _ = write!(out, "\\u{:04x}", c as u32);
}
c => out.push(c),
}
}
out.push('"');
out
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn plain_text_is_merely_quoted() {
assert_eq!(json_string("AUTH_JWT_SECRET"), "\"AUTH_JWT_SECRET\"");
assert_eq!(json_string(""), "\"\"");
}
#[test]
fn structural_characters_are_escaped() {
assert_eq!(json_string("a\"b"), "\"a\\\"b\"");
assert_eq!(json_string("a\\b"), "\"a\\\\b\"");
}
#[test]
fn the_control_range_is_escaped() {
assert_eq!(json_string("a\nb"), "\"a\\nb\"");
assert_eq!(json_string("a\rb"), "\"a\\rb\"");
assert_eq!(json_string("a\tb"), "\"a\\tb\"");
assert_eq!(json_string("a\u{1}b"), "\"a\\u0001b\"");
assert_eq!(json_string("a\u{0}b"), "\"a\\u0000b\"");
assert_eq!(json_string("a\u{1f}b"), "\"a\\u001fb\"");
}
#[test]
fn space_and_above_pass_through() {
assert_eq!(json_string("a b"), "\"a b\"");
assert_eq!(json_string("a\u{7f}b"), "\"a\u{7f}b\"");
assert_eq!(json_string("héllo ☃"), "\"héllo ☃\"");
}
}