Austin Schuh | 272c613 | 2020-11-14 16:37:52 -0800 | [diff] [blame] | 1 | // 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 | |
| 15 | use crate::Builder; |
| 16 | use serde::ser; |
| 17 | use serde::ser::*; |
| 18 | use 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)] |
| 25 | pub struct FlexbufferSerializer { |
| 26 | builder: Builder, |
| 27 | nesting: Vec<Option<usize>>, |
| 28 | } |
| 29 | impl 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. |
| 77 | pub enum Error { |
| 78 | /// Only `str` and `String` can be serialized as keys in serde maps. |
| 79 | KeyMustBeString, |
| 80 | Serde(String), |
| 81 | } |
| 82 | |
| 83 | impl std::fmt::Display for Error { |
| 84 | fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { |
| 85 | write!(f, "{:?}", self) |
| 86 | } |
| 87 | } |
| 88 | impl std::error::Error for Error {} |
| 89 | impl ser::Error for Error { |
| 90 | fn custom<T>(msg: T) -> Self |
| 91 | where |
| 92 | T: Display, |
| 93 | { |
| 94 | Self::Serde(format!("{}", msg)) |
| 95 | } |
| 96 | } |
| 97 | impl<'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). |
| 112 | impl<'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 | } |
| 131 | impl<'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 | } |
| 144 | impl<'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 | } |
| 157 | impl<'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 | } |
| 175 | impl<'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 | } |
| 189 | impl<'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 | |
| 210 | impl<'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 | |
| 385 | fn key_must_be_a_string<T>() -> Result<T, Error> { |
| 386 | Err(Error::KeyMustBeString) |
| 387 | } |
| 388 | struct MapKeySerializer<'a>(&'a mut FlexbufferSerializer); |
| 389 | impl<'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 | } |