1use 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}