ssr/
json.rs

1// This is slightly modified version of formatter taken from
2// https://github.com/xd009642/tarpaulin/blob/fd7059131cf7f838a68e681a9ddeefb26a8adf7c/src/report/safe_json.rs
3// All copyrights belong to the author of this implementation.
4
5use std::{default::Default, io};
6
7use serde_json::{
8    ser::{CharEscape, CompactFormatter, Formatter},
9    Serializer,
10};
11
12struct JsonFormatter(CompactFormatter);
13
14impl Default for JsonFormatter {
15    fn default() -> Self {
16        JsonFormatter(CompactFormatter)
17    }
18}
19
20impl Formatter for JsonFormatter {
21    fn write_string_fragment<W: ?Sized>(&mut self, writer: &mut W, fragment: &str) -> io::Result<()>
22    where
23        W: io::Write,
24    {
25        let mut start = 0;
26        let mut code_length = 0;
27        for char in fragment.chars() {
28            code_length += char.len_utf8();
29            let escape = match char {
30                '<' | '>' | '&' => CharEscape::AsciiControl(char as u8),
31                _ => continue,
32            };
33            if start < code_length - 1 {
34                self.0
35                    .write_string_fragment(writer, &fragment[start..code_length - 1])?;
36            }
37
38            self.write_char_escape(writer, escape)?;
39
40            start = code_length;
41        }
42
43        if start < code_length {
44            self.0.write_string_fragment(writer, &fragment[start..])?;
45        }
46
47        Ok(())
48    }
49}
50
51pub fn to_vec<T: serde::Serialize + ?Sized>(value: &T) -> Result<Vec<u8>, serde_json::Error> {
52    let mut writer = Vec::new();
53    let mut ser = Serializer::with_formatter(&mut writer, JsonFormatter::default());
54    value.serialize(&mut ser)?;
55    Ok(writer)
56}