blob: 7ef77577dfe865b36c6f2430f1df26abd57341e9 [file] [log] [blame]
Austin Schuh272c6132020-11-14 16:37:52 -08001// Copyright 2019 Google LLC
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use crate::Builder;
16use serde::ser;
17use serde::ser::*;
18use std::fmt::Display;
19
20// This struct internally tracks the nested vectors representing
21// nested structs and such.
22// TODO: Add an option field names in a map.
23/// Flexbuffer Serializer. This should be used to serialize structs.
24#[derive(Debug, Default)]
25pub struct FlexbufferSerializer {
26 builder: Builder,
27 nesting: Vec<Option<usize>>,
28}
29impl FlexbufferSerializer {
30 pub fn new() -> Self {
31 Self::default()
32 }
33 pub fn view(&self) -> &[u8] {
34 self.builder.view()
35 }
36 pub fn take_buffer(&mut self) -> Vec<u8> {
37 self.builder.take_buffer()
38 }
James Kuszmaul8e62b022022-03-22 09:33:25 -070039 pub fn reset(&mut self) {
40 self.builder.reset();
41 self.nesting.clear();
42 }
Austin Schuh272c6132020-11-14 16:37:52 -080043 fn finish_if_not_nested(&mut self) -> Result<(), Error> {
44 if self.nesting.is_empty() {
45 assert_eq!(self.builder.values.len(), 1);
46 let root = self.builder.values.pop().unwrap();
47 super::store_root(&mut self.builder.buffer, root);
48 }
49 Ok(())
50 }
51 fn start_vector(&mut self) {
52 let previous_end = if self.nesting.is_empty() {
53 None
54 } else {
55 Some(self.builder.values.len())
56 };
57 self.nesting.push(previous_end);
58 }
59 fn start_map(&mut self) {
60 let previous_end = if self.nesting.is_empty() {
61 None
62 } else {
63 Some(self.builder.values.len())
64 };
65 self.nesting.push(previous_end);
66 }
67 fn end_vector(&mut self) -> Result<(), Error> {
68 let previous_end = self.nesting.pop().unwrap();
69 self.builder.end_map_or_vector(false, previous_end);
70 Ok(())
71 }
72 fn end_map(&mut self) -> Result<(), Error> {
73 let previous_end = self.nesting.pop().unwrap();
74 self.builder.end_map_or_vector(true, previous_end);
75 Ok(())
76 }
77}
78
79#[derive(Debug)]
80/// Errors that may happen with Serde.
81pub enum Error {
82 /// Only `str` and `String` can be serialized as keys in serde maps.
83 KeyMustBeString,
84 Serde(String),
85}
86
87impl std::fmt::Display for Error {
88 fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
89 write!(f, "{:?}", self)
90 }
91}
92impl std::error::Error for Error {}
93impl ser::Error for Error {
94 fn custom<T>(msg: T) -> Self
95 where
96 T: Display,
97 {
98 Self::Serde(format!("{}", msg))
99 }
100}
101impl<'a> ser::SerializeSeq for &mut FlexbufferSerializer {
102 type Ok = ();
103 type Error = Error;
104 fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
105 where
106 T: Serialize,
107 {
108 value.serialize(&mut **self)
109 }
110 fn end(self) -> Result<Self::Ok, Self::Error> {
111 self.end_vector()
112 }
113}
114// This is unlike a flexbuffers map which requires CString like keys.
115// Its implemented as alternating keys and values (hopefully).
116impl<'a> ser::SerializeMap for &'a mut FlexbufferSerializer {
117 type Ok = ();
118 type Error = Error;
119 fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), Self::Error>
120 where
121 T: Serialize,
122 {
123 key.serialize(MapKeySerializer(&mut **self))
124 }
125 fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
126 where
127 T: Serialize,
128 {
129 value.serialize(&mut **self)
130 }
131 fn end(self) -> Result<Self::Ok, Self::Error> {
132 self.end_map()
133 }
134}
135impl<'a> ser::SerializeTuple for &mut FlexbufferSerializer {
136 type Ok = ();
137 type Error = Error;
138 fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
139 where
140 T: Serialize,
141 {
142 value.serialize(&mut **self)
143 }
144 fn end(self) -> Result<Self::Ok, Self::Error> {
145 self.end_vector()
146 }
147}
148impl<'a> ser::SerializeTupleStruct for &mut FlexbufferSerializer {
149 type Ok = ();
150 type Error = Error;
151 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
152 where
153 T: Serialize,
154 {
155 value.serialize(&mut **self)
156 }
157 fn end(self) -> Result<Self::Ok, Self::Error> {
158 self.end_vector()
159 }
160}
161impl<'a> ser::SerializeStruct for &mut FlexbufferSerializer {
162 type Ok = ();
163 type Error = Error;
164 fn serialize_field<T: ?Sized>(
165 &mut self,
166 key: &'static str,
167 value: &T,
168 ) -> Result<(), Self::Error>
169 where
170 T: Serialize,
171 {
172 self.builder.push_key(key);
173 value.serialize(&mut **self)
174 }
175 fn end(self) -> Result<Self::Ok, Self::Error> {
176 self.end_map()
177 }
178}
179impl<'a> ser::SerializeTupleVariant for &mut FlexbufferSerializer {
180 type Ok = ();
181 type Error = Error;
182 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
183 where
184 T: Serialize,
185 {
186 value.serialize(&mut **self)
187 }
188 fn end(self) -> Result<Self::Ok, Self::Error> {
189 self.end_vector()?;
190 self.end_map()
191 }
192}
193impl<'a> ser::SerializeStructVariant for &mut FlexbufferSerializer {
194 type Ok = ();
195 type Error = Error;
196 fn serialize_field<T: ?Sized>(
197 &mut self,
198 key: &'static str,
199 value: &T,
200 ) -> Result<(), Self::Error>
201 where
202 T: Serialize,
203 {
204 self.builder.push_key(key);
205 value.serialize(&mut **self)
206 }
207 fn end(self) -> Result<Self::Ok, Self::Error> {
208 self.end_map()?;
209 self.end_map()
210 }
211 // TODO: skip field?
212}
213
214impl<'a> ser::Serializer for &'a mut FlexbufferSerializer {
215 type SerializeSeq = &'a mut FlexbufferSerializer;
216 type SerializeTuple = &'a mut FlexbufferSerializer;
217 type SerializeTupleStruct = &'a mut FlexbufferSerializer;
218 type SerializeTupleVariant = &'a mut FlexbufferSerializer;
219 type SerializeMap = &'a mut FlexbufferSerializer;
220 type SerializeStruct = &'a mut FlexbufferSerializer;
221 type SerializeStructVariant = &'a mut FlexbufferSerializer;
222 type Ok = ();
223 type Error = Error;
224 fn is_human_readable(&self) -> bool {
225 cfg!(serialize_human_readable)
226 }
227 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
228 self.builder.push(v);
229 self.finish_if_not_nested()
230 }
231 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
232 self.builder.push(v);
233 self.finish_if_not_nested()
234 }
235 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
236 self.builder.push(v);
237 self.finish_if_not_nested()
238 }
239 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
240 self.builder.push(v);
241 self.finish_if_not_nested()
242 }
243 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
244 self.builder.push(v);
245 self.finish_if_not_nested()
246 }
247 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
248 self.builder.push(v);
249 self.finish_if_not_nested()
250 }
251 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
252 self.builder.push(v);
253 self.finish_if_not_nested()
254 }
255 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
256 self.builder.push(v);
257 self.finish_if_not_nested()
258 }
259 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
260 self.builder.push(v);
261 self.finish_if_not_nested()
262 }
263 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
264 self.builder.push(v);
265 self.finish_if_not_nested()
266 }
267 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
268 self.builder.push(v);
269 self.finish_if_not_nested()
270 }
271 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
272 self.builder.push(v as u8);
273 self.finish_if_not_nested()
274 }
275 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
276 self.builder.push(v);
277 self.finish_if_not_nested()
278 }
279 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
280 self.builder.push(crate::Blob(v));
281 self.finish_if_not_nested()
282 }
283 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
284 self.builder.push(());
285 self.finish_if_not_nested()
286 }
287 fn serialize_some<T: ?Sized>(self, t: &T) -> Result<Self::Ok, Self::Error>
288 where
289 T: Serialize,
290 {
291 t.serialize(self)
292 }
293 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
294 self.builder.push(());
295 self.finish_if_not_nested()
296 }
297 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
298 self.builder.push(());
299 self.finish_if_not_nested()
300 }
301 fn serialize_unit_variant(
302 self,
303 _name: &'static str,
304 _variant_index: u32,
305 variant: &'static str,
306 ) -> Result<Self::Ok, Self::Error> {
307 self.builder.push(variant);
308 self.finish_if_not_nested()
309 }
310 fn serialize_newtype_struct<T: ?Sized>(
311 self,
312 _name: &'static str,
313 value: &T,
314 ) -> Result<Self::Ok, Self::Error>
315 where
316 T: Serialize,
317 {
318 value.serialize(self)
319 }
320 fn serialize_newtype_variant<T: ?Sized>(
321 self,
322 _name: &'static str,
323 _variant_index: u32,
324 variant: &'static str,
325 value: &T,
326 ) -> Result<Self::Ok, Self::Error>
327 where
328 T: Serialize,
329 {
330 self.start_map();
331 self.builder.push_key(variant);
332 value.serialize(&mut *self)?;
333 self.end_map()
334 }
335 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
336 self.start_vector();
337 Ok(self)
338 }
339 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
340 self.start_vector();
341 Ok(self)
342 }
343 fn serialize_tuple_struct(
344 self,
345 _name: &'static str,
346 _len: usize,
347 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
348 self.start_map();
349 Ok(self)
350 }
351 fn serialize_tuple_variant(
352 self,
353 _name: &'static str,
354 _variant_index: u32,
355 variant: &'static str,
356 _len: usize,
357 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
358 self.start_map();
359 self.builder.push_key(variant);
360 self.start_vector();
361 Ok(self)
362 }
363 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
364 self.start_map();
365 Ok(self)
366 }
367 fn serialize_struct(
368 self,
369 _name: &'static str,
370 _len: usize,
371 ) -> Result<Self::SerializeStruct, Self::Error> {
372 self.start_map();
373 Ok(self)
374 }
375 fn serialize_struct_variant(
376 self,
377 _name: &'static str,
378 _variant_index: u32,
379 variant: &'static str,
380 _len: usize,
381 ) -> Result<Self::SerializeStructVariant, Self::Error> {
382 self.start_map();
383 self.builder.push_key(variant);
384 self.start_map();
385 Ok(self)
386 }
387}
388
389fn key_must_be_a_string<T>() -> Result<T, Error> {
390 Err(Error::KeyMustBeString)
391}
392struct MapKeySerializer<'a>(&'a mut FlexbufferSerializer);
393impl<'a> Serializer for MapKeySerializer<'a> {
394 type Ok = ();
395 type Error = Error;
396 #[inline]
397 fn serialize_str(self, value: &str) -> Result<(), Error> {
398 self.0.builder.push_key(value);
399 Ok(())
400 }
401 #[inline]
402 fn serialize_unit_variant(
403 self,
404 _name: &'static str,
405 _variant_index: u32,
406 variant: &'static str,
407 ) -> Result<(), Error> {
408 self.0.builder.push_key(variant);
409 Ok(())
410 }
411 #[inline]
412 fn serialize_newtype_struct<T: ?Sized>(
413 self,
414 _name: &'static str,
415 value: &T,
416 ) -> Result<(), Error>
417 where
418 T: Serialize,
419 {
420 value.serialize(self)
421 }
422 type SerializeSeq = Impossible<(), Error>;
423 type SerializeTuple = Impossible<(), Error>;
424 type SerializeTupleStruct = Impossible<(), Error>;
425 type SerializeTupleVariant = Impossible<(), Error>;
426 type SerializeMap = Impossible<(), Error>;
427 type SerializeStruct = Impossible<(), Error>;
428 type SerializeStructVariant = Impossible<(), Error>;
429
430 fn serialize_bool(self, _value: bool) -> Result<(), Error> {
431 key_must_be_a_string()
432 }
433 fn serialize_i8(self, _value: i8) -> Result<(), Error> {
434 key_must_be_a_string()
435 }
436 fn serialize_i16(self, _value: i16) -> Result<(), Error> {
437 key_must_be_a_string()
438 }
439 fn serialize_i32(self, _value: i32) -> Result<(), Error> {
440 key_must_be_a_string()
441 }
442 fn serialize_i64(self, _value: i64) -> Result<(), Error> {
443 key_must_be_a_string()
444 }
445 fn serialize_u8(self, _value: u8) -> Result<(), Error> {
446 key_must_be_a_string()
447 }
448 fn serialize_u16(self, _value: u16) -> Result<(), Error> {
449 key_must_be_a_string()
450 }
451 fn serialize_u32(self, _value: u32) -> Result<(), Error> {
452 key_must_be_a_string()
453 }
454 fn serialize_u64(self, _value: u64) -> Result<(), Error> {
455 key_must_be_a_string()
456 }
457 fn serialize_f32(self, _value: f32) -> Result<(), Error> {
458 key_must_be_a_string()
459 }
460 fn serialize_f64(self, _value: f64) -> Result<(), Error> {
461 key_must_be_a_string()
462 }
463 fn serialize_char(self, _value: char) -> Result<(), Error> {
464 key_must_be_a_string()
465 }
466 fn serialize_bytes(self, _value: &[u8]) -> Result<(), Error> {
467 key_must_be_a_string()
468 }
469 fn serialize_unit(self) -> Result<(), Error> {
470 key_must_be_a_string()
471 }
472 fn serialize_unit_struct(self, _name: &'static str) -> Result<(), Error> {
473 key_must_be_a_string()
474 }
475 fn serialize_newtype_variant<T: ?Sized>(
476 self,
477 _name: &'static str,
478 _variant_index: u32,
479 _variant: &'static str,
480 _value: &T,
481 ) -> Result<(), Error>
482 where
483 T: Serialize,
484 {
485 key_must_be_a_string()
486 }
487 fn serialize_none(self) -> Result<(), Error> {
488 key_must_be_a_string()
489 }
490 fn serialize_some<T: ?Sized>(self, _value: &T) -> Result<(), Error>
491 where
492 T: Serialize,
493 {
494 key_must_be_a_string()
495 }
496 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Error> {
497 key_must_be_a_string()
498 }
499 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Error> {
500 key_must_be_a_string()
501 }
502 fn serialize_tuple_struct(
503 self,
504 _name: &'static str,
505 _len: usize,
506 ) -> Result<Self::SerializeTupleStruct, Error> {
507 key_must_be_a_string()
508 }
509 fn serialize_tuple_variant(
510 self,
511 _name: &'static str,
512 _variant_index: u32,
513 _variant: &'static str,
514 _len: usize,
515 ) -> Result<Self::SerializeTupleVariant, Error> {
516 key_must_be_a_string()
517 }
518 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Error> {
519 key_must_be_a_string()
520 }
521 fn serialize_struct(
522 self,
523 _name: &'static str,
524 _len: usize,
525 ) -> Result<Self::SerializeStruct, Error> {
526 key_must_be_a_string()
527 }
528 fn serialize_struct_variant(
529 self,
530 _name: &'static str,
531 _variant_index: u32,
532 _variant: &'static str,
533 _len: usize,
534 ) -> Result<Self::SerializeStructVariant, Error> {
535 key_must_be_a_string()
536 }
537}