1use facet_core::Facet;
2use facet_reflect::Peek;
3use facet_serialize::{Serializer, serialize_iterative};
4use log::debug;
5use std::io::{self, Write};
6
7#[cfg(feature = "std")]
9pub fn to_string<'facet, T: Facet<'facet>>(value: &T) -> String {
10 peek_to_string(Peek::new(value))
11}
12
13#[cfg(feature = "std")]
15pub fn peek_to_string<'input, 'facet, 'shape>(peek: Peek<'input, 'facet, 'shape>) -> String {
16 let mut s = Vec::new();
17 peek_to_writer(peek, &mut s).unwrap();
18 String::from_utf8(s).unwrap()
19}
20
21pub fn to_writer<'mem, 'facet, T: Facet<'facet>, W: Write>(
23 value: &'mem T,
24 writer: &mut W,
25) -> io::Result<()> {
26 peek_to_writer(Peek::new(value), writer)
27}
28
29pub fn peek_to_writer<'mem, 'facet, 'shape, W: Write>(
31 peek: Peek<'mem, 'facet, 'shape>,
32 writer: &mut W,
33) -> io::Result<()> {
34 let mut serializer = JsonSerializer::new(writer);
35 serialize_iterative(peek, &mut serializer)
36}
37#[derive(Debug)]
38enum StackItem {
39 ArrayItem { first: bool },
40 ObjectItem { object_state: ObjectItemState },
41}
42
43#[derive(Debug)]
44enum ObjectItemState {
45 FirstKey,
46 Key,
47 Value,
48}
49
50pub struct JsonSerializer<W> {
52 writer: W,
53 stack: Vec<StackItem>,
54}
55
56impl<W> JsonSerializer<W>
57where
58 W: Write,
59{
60 pub fn new(writer: W) -> Self {
62 Self {
63 writer,
64 stack: Vec::new(),
65 }
66 }
67
68 fn start_value(&mut self) -> Result<(), io::Error> {
69 debug!("start_value, stack = {:?}", self.stack);
70
71 match self.stack.last_mut() {
72 Some(StackItem::ArrayItem { first }) => {
73 if *first {
74 *first = false;
75 } else {
76 write!(self.writer, ",")?;
77 }
78 }
79 Some(StackItem::ObjectItem { object_state }) => {
80 debug!("ObjectItem: object_state = {:?}", object_state);
81 match object_state {
82 ObjectItemState::FirstKey => {
83 *object_state = ObjectItemState::Value;
84 }
85 ObjectItemState::Key => {
86 write!(self.writer, ",")?;
87 *object_state = ObjectItemState::Value;
88 }
89 ObjectItemState::Value => {
90 write!(self.writer, ":")?;
91 *object_state = ObjectItemState::Key;
92 }
93 }
94 }
95 None => {
96 debug!("No stack frame (top-level value)");
97 }
98 }
99
100 Ok(())
101 }
102
103 fn end_value(&mut self) -> Result<(), io::Error> {
104 Ok(())
105 }
106}
107
108impl<'shape, W> Serializer<'shape> for JsonSerializer<W>
109where
110 W: Write,
111{
112 type Error = io::Error;
113
114 fn serialize_u8(&mut self, value: u8) -> Result<(), Self::Error> {
115 self.start_value()?;
116 write!(self.writer, "{}", value)?;
117 self.end_value()
118 }
119
120 fn serialize_u16(&mut self, value: u16) -> Result<(), Self::Error> {
121 self.start_value()?;
122 write!(self.writer, "{}", value)?;
123 self.end_value()
124 }
125
126 fn serialize_u32(&mut self, value: u32) -> Result<(), Self::Error> {
127 self.start_value()?;
128 write!(self.writer, "{}", value)?;
129 self.end_value()
130 }
131
132 fn serialize_u64(&mut self, value: u64) -> Result<(), Self::Error> {
133 self.start_value()?;
134 write!(self.writer, "{}", value)?;
135 self.end_value()
136 }
137
138 fn serialize_u128(&mut self, value: u128) -> Result<(), Self::Error> {
139 self.start_value()?;
140 write!(self.writer, "{}", value)?;
141 self.end_value()
142 }
143
144 fn serialize_usize(&mut self, value: usize) -> Result<(), Self::Error> {
145 self.start_value()?;
146 write!(self.writer, "{}", value)?;
147 self.end_value()
148 }
149
150 fn serialize_i8(&mut self, value: i8) -> Result<(), Self::Error> {
151 self.start_value()?;
152 write!(self.writer, "{}", value)?;
153 self.end_value()
154 }
155
156 fn serialize_i16(&mut self, value: i16) -> Result<(), Self::Error> {
157 self.start_value()?;
158 write!(self.writer, "{}", value)?;
159 self.end_value()
160 }
161
162 fn serialize_i32(&mut self, value: i32) -> Result<(), Self::Error> {
163 self.start_value()?;
164 write!(self.writer, "{}", value)?;
165 self.end_value()
166 }
167
168 fn serialize_i64(&mut self, value: i64) -> Result<(), Self::Error> {
169 self.start_value()?;
170 write!(self.writer, "{}", value)?;
171 self.end_value()
172 }
173
174 fn serialize_i128(&mut self, value: i128) -> Result<(), Self::Error> {
175 self.start_value()?;
176 write!(self.writer, "{}", value)?;
177 self.end_value()
178 }
179
180 fn serialize_isize(&mut self, value: isize) -> Result<(), Self::Error> {
181 self.start_value()?;
182 write!(self.writer, "{}", value)?;
183 self.end_value()
184 }
185
186 fn serialize_f32(&mut self, value: f32) -> Result<(), Self::Error> {
187 self.start_value()?;
188 write!(self.writer, "{}", value)?;
189 self.end_value()
190 }
191
192 fn serialize_f64(&mut self, value: f64) -> Result<(), Self::Error> {
193 self.start_value()?;
194 write!(self.writer, "{}", value)?;
195 self.end_value()
196 }
197
198 fn serialize_bool(&mut self, value: bool) -> Result<(), Self::Error> {
199 self.start_value()?;
200 write!(self.writer, "{}", if value { "true" } else { "false" })?;
201 self.end_value()
202 }
203
204 fn serialize_char(&mut self, value: char) -> Result<(), Self::Error> {
205 self.start_value()?;
206 self.writer.write_all(b"\"")?;
207 crate::write_json_escaped_char(&mut self.writer, value)?;
208 self.writer.write_all(b"\"")?;
209 self.end_value()
210 }
211
212 fn serialize_str(&mut self, value: &str) -> Result<(), Self::Error> {
213 self.start_value()?;
214 crate::write_json_string(&mut self.writer, value)?;
215 self.end_value()
216 }
217
218 fn serialize_bytes(&mut self, _value: &[u8]) -> Result<(), Self::Error> {
219 panic!("JSON does not support byte arrays")
220 }
221
222 fn serialize_none(&mut self) -> Result<(), Self::Error> {
223 self.start_value()?;
224 self.writer.write_all(b"null")?;
225 self.end_value()
226 }
227
228 fn serialize_unit(&mut self) -> Result<(), Self::Error> {
229 self.start_value()?;
230 self.writer.write_all(b"null")?;
231 self.end_value()
232 }
233
234 fn serialize_unit_variant(
235 &mut self,
236 _variant_index: usize,
237 variant_name: &'shape str,
238 ) -> Result<(), Self::Error> {
239 self.start_value()?;
240 crate::write_json_string(&mut self.writer, variant_name)?;
241 self.end_value()
242 }
243
244 fn start_object(&mut self, _len: Option<usize>) -> Result<(), Self::Error> {
245 self.start_value()?;
246 self.writer.write_all(b"{")?;
247 self.stack.push(StackItem::ObjectItem {
248 object_state: ObjectItemState::FirstKey,
249 });
250 Ok(())
251 }
252
253 fn end_object(&mut self) -> Result<(), Self::Error> {
254 let object = self.stack.pop().unwrap();
255 match object {
256 StackItem::ArrayItem { .. } => unreachable!(),
257 StackItem::ObjectItem { object_state } => match object_state {
258 ObjectItemState::FirstKey | ObjectItemState::Key => {
259 }
261 ObjectItemState::Value => unreachable!(),
262 },
263 }
264 self.writer.write_all(b"}")?;
265 self.end_value()?;
266 Ok(())
267 }
268
269 fn start_array(&mut self, _len: Option<usize>) -> Result<(), Self::Error> {
270 self.start_value()?;
271 self.writer.write_all(b"[")?;
272 self.stack.push(StackItem::ArrayItem { first: true });
273 Ok(())
274 }
275
276 fn end_array(&mut self) -> Result<(), Self::Error> {
277 let item = self.stack.pop().unwrap();
278 match item {
279 StackItem::ArrayItem { .. } => {
280 }
282 StackItem::ObjectItem { .. } => unreachable!(),
283 }
284 self.writer.write_all(b"]")?;
285 self.end_value()?;
286 Ok(())
287 }
288
289 fn start_map(&mut self, _len: Option<usize>) -> Result<(), Self::Error> {
290 self.start_object(_len)
291 }
292
293 fn end_map(&mut self) -> Result<(), Self::Error> {
294 self.end_object()
295 }
296
297 fn serialize_field_name(&mut self, name: &'shape str) -> Result<(), Self::Error> {
298 if let Some(StackItem::ObjectItem { object_state }) = self.stack.last_mut() {
300 match object_state {
301 ObjectItemState::FirstKey => {
302 *object_state = ObjectItemState::Key;
303 }
304 ObjectItemState::Key => {
305 self.writer.write_all(b",")?;
306 }
307 ObjectItemState::Value => unreachable!(),
308 }
309 }
310 crate::write_json_string(&mut self.writer, name)?;
311 if let Some(StackItem::ObjectItem { object_state }) = self.stack.last_mut() {
312 *object_state = ObjectItemState::Value;
313 }
314 Ok(())
315 }
316}