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