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 {
new() -> Self30 pub fn new() -> Self {
31 Self::default()
32 }
view(&self) -> &[u8]33 pub fn view(&self) -> &[u8] {
34 self.builder.view()
35 }
take_buffer(&mut self) -> Vec<u8>36 pub fn take_buffer(&mut self) -> Vec<u8> {
37 self.builder.take_buffer()
38 }
reset(&mut self)39 pub fn reset(&mut self) {
40 self.builder.reset();
41 self.nesting.clear();
42 }
finish_if_not_nested(&mut self) -> Result<(), Error>43 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 }
start_vector(&mut self)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 }
start_map(&mut self)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 }
end_vector(&mut self) -> Result<(), Error>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 }
end_map(&mut self) -> Result<(), Error>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.
81 pub enum Error {
82 /// Only `str` and `String` can be serialized as keys in serde maps.
83 KeyMustBeString,
84 Serde(String),
85 }
86
87 impl std::fmt::Display for Error {
fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error>88 fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
89 write!(f, "{:?}", self)
90 }
91 }
92 impl std::error::Error for Error {}
93 impl ser::Error for Error {
custom<T>(msg: T) -> Self where T: Display,94 fn custom<T>(msg: T) -> Self
95 where
96 T: Display,
97 {
98 Self::Serde(format!("{}", msg))
99 }
100 }
101 impl<'a> ser::SerializeSeq for &mut FlexbufferSerializer {
102 type Ok = ();
103 type Error = Error;
serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> where T: Serialize,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 }
end(self) -> Result<Self::Ok, Self::Error>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).
116 impl<'a> ser::SerializeMap for &'a mut FlexbufferSerializer {
117 type Ok = ();
118 type Error = Error;
serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), Self::Error> where T: Serialize,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 }
serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> where T: Serialize,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 }
end(self) -> Result<Self::Ok, Self::Error>131 fn end(self) -> Result<Self::Ok, Self::Error> {
132 self.end_map()
133 }
134 }
135 impl<'a> ser::SerializeTuple for &mut FlexbufferSerializer {
136 type Ok = ();
137 type Error = Error;
serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> where T: Serialize,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 }
end(self) -> Result<Self::Ok, Self::Error>144 fn end(self) -> Result<Self::Ok, Self::Error> {
145 self.end_vector()
146 }
147 }
148 impl<'a> ser::SerializeTupleStruct for &mut FlexbufferSerializer {
149 type Ok = ();
150 type Error = Error;
serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> where T: Serialize,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 }
end(self) -> Result<Self::Ok, Self::Error>157 fn end(self) -> Result<Self::Ok, Self::Error> {
158 self.end_vector()
159 }
160 }
161 impl<'a> ser::SerializeStruct for &mut FlexbufferSerializer {
162 type Ok = ();
163 type Error = Error;
serialize_field<T: ?Sized>( &mut self, key: &'static str, value: &T, ) -> Result<(), Self::Error> where T: Serialize,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 }
end(self) -> Result<Self::Ok, Self::Error>175 fn end(self) -> Result<Self::Ok, Self::Error> {
176 self.end_map()
177 }
178 }
179 impl<'a> ser::SerializeTupleVariant for &mut FlexbufferSerializer {
180 type Ok = ();
181 type Error = Error;
serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> where T: Serialize,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 }
end(self) -> Result<Self::Ok, Self::Error>188 fn end(self) -> Result<Self::Ok, Self::Error> {
189 self.end_vector()?;
190 self.end_map()
191 }
192 }
193 impl<'a> ser::SerializeStructVariant for &mut FlexbufferSerializer {
194 type Ok = ();
195 type Error = Error;
serialize_field<T: ?Sized>( &mut self, key: &'static str, value: &T, ) -> Result<(), Self::Error> where T: Serialize,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 }
end(self) -> Result<Self::Ok, Self::Error>207 fn end(self) -> Result<Self::Ok, Self::Error> {
208 self.end_map()?;
209 self.end_map()
210 }
211 // TODO: skip field?
212 }
213
214 impl<'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;
is_human_readable(&self) -> bool224 fn is_human_readable(&self) -> bool {
225 cfg!(serialize_human_readable)
226 }
serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error>227 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
228 self.builder.push(v);
229 self.finish_if_not_nested()
230 }
serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error>231 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
232 self.builder.push(v);
233 self.finish_if_not_nested()
234 }
serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error>235 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
236 self.builder.push(v);
237 self.finish_if_not_nested()
238 }
serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error>239 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
240 self.builder.push(v);
241 self.finish_if_not_nested()
242 }
serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error>243 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
244 self.builder.push(v);
245 self.finish_if_not_nested()
246 }
serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error>247 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
248 self.builder.push(v);
249 self.finish_if_not_nested()
250 }
serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error>251 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
252 self.builder.push(v);
253 self.finish_if_not_nested()
254 }
serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error>255 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
256 self.builder.push(v);
257 self.finish_if_not_nested()
258 }
serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error>259 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
260 self.builder.push(v);
261 self.finish_if_not_nested()
262 }
serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error>263 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
264 self.builder.push(v);
265 self.finish_if_not_nested()
266 }
serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error>267 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
268 self.builder.push(v);
269 self.finish_if_not_nested()
270 }
serialize_char(self, v: char) -> Result<Self::Ok, Self::Error>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 }
serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error>275 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
276 self.builder.push(v);
277 self.finish_if_not_nested()
278 }
serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error>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 }
serialize_none(self) -> Result<Self::Ok, Self::Error>283 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
284 self.builder.push(());
285 self.finish_if_not_nested()
286 }
serialize_some<T: ?Sized>(self, t: &T) -> Result<Self::Ok, Self::Error> where T: Serialize,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 }
serialize_unit(self) -> Result<Self::Ok, Self::Error>293 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
294 self.builder.push(());
295 self.finish_if_not_nested()
296 }
serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error>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 }
serialize_unit_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, ) -> Result<Self::Ok, Self::Error>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 }
serialize_newtype_struct<T: ?Sized>( self, _name: &'static str, value: &T, ) -> Result<Self::Ok, Self::Error> where T: Serialize,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 }
serialize_newtype_variant<T: ?Sized>( self, _name: &'static str, _variant_index: u32, variant: &'static str, value: &T, ) -> Result<Self::Ok, Self::Error> where T: Serialize,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 }
serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error>335 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
336 self.start_vector();
337 Ok(self)
338 }
serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error>339 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
340 self.start_vector();
341 Ok(self)
342 }
serialize_tuple_struct( self, _name: &'static str, _len: usize, ) -> Result<Self::SerializeTupleStruct, Self::Error>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 }
serialize_tuple_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, _len: usize, ) -> Result<Self::SerializeTupleVariant, Self::Error>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 }
serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error>363 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
364 self.start_map();
365 Ok(self)
366 }
serialize_struct( self, _name: &'static str, _len: usize, ) -> Result<Self::SerializeStruct, Self::Error>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 }
serialize_struct_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, _len: usize, ) -> Result<Self::SerializeStructVariant, Self::Error>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
key_must_be_a_string<T>() -> Result<T, Error>389 fn key_must_be_a_string<T>() -> Result<T, Error> {
390 Err(Error::KeyMustBeString)
391 }
392 struct MapKeySerializer<'a>(&'a mut FlexbufferSerializer);
393 impl<'a> Serializer for MapKeySerializer<'a> {
394 type Ok = ();
395 type Error = Error;
396 #[inline]
serialize_str(self, value: &str) -> Result<(), Error>397 fn serialize_str(self, value: &str) -> Result<(), Error> {
398 self.0.builder.push_key(value);
399 Ok(())
400 }
401 #[inline]
serialize_unit_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, ) -> Result<(), Error>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]
serialize_newtype_struct<T: ?Sized>( self, _name: &'static str, value: &T, ) -> Result<(), Error> where T: Serialize,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
serialize_bool(self, _value: bool) -> Result<(), Error>430 fn serialize_bool(self, _value: bool) -> Result<(), Error> {
431 key_must_be_a_string()
432 }
serialize_i8(self, _value: i8) -> Result<(), Error>433 fn serialize_i8(self, _value: i8) -> Result<(), Error> {
434 key_must_be_a_string()
435 }
serialize_i16(self, _value: i16) -> Result<(), Error>436 fn serialize_i16(self, _value: i16) -> Result<(), Error> {
437 key_must_be_a_string()
438 }
serialize_i32(self, _value: i32) -> Result<(), Error>439 fn serialize_i32(self, _value: i32) -> Result<(), Error> {
440 key_must_be_a_string()
441 }
serialize_i64(self, _value: i64) -> Result<(), Error>442 fn serialize_i64(self, _value: i64) -> Result<(), Error> {
443 key_must_be_a_string()
444 }
serialize_u8(self, _value: u8) -> Result<(), Error>445 fn serialize_u8(self, _value: u8) -> Result<(), Error> {
446 key_must_be_a_string()
447 }
serialize_u16(self, _value: u16) -> Result<(), Error>448 fn serialize_u16(self, _value: u16) -> Result<(), Error> {
449 key_must_be_a_string()
450 }
serialize_u32(self, _value: u32) -> Result<(), Error>451 fn serialize_u32(self, _value: u32) -> Result<(), Error> {
452 key_must_be_a_string()
453 }
serialize_u64(self, _value: u64) -> Result<(), Error>454 fn serialize_u64(self, _value: u64) -> Result<(), Error> {
455 key_must_be_a_string()
456 }
serialize_f32(self, _value: f32) -> Result<(), Error>457 fn serialize_f32(self, _value: f32) -> Result<(), Error> {
458 key_must_be_a_string()
459 }
serialize_f64(self, _value: f64) -> Result<(), Error>460 fn serialize_f64(self, _value: f64) -> Result<(), Error> {
461 key_must_be_a_string()
462 }
serialize_char(self, _value: char) -> Result<(), Error>463 fn serialize_char(self, _value: char) -> Result<(), Error> {
464 key_must_be_a_string()
465 }
serialize_bytes(self, _value: &[u8]) -> Result<(), Error>466 fn serialize_bytes(self, _value: &[u8]) -> Result<(), Error> {
467 key_must_be_a_string()
468 }
serialize_unit(self) -> Result<(), Error>469 fn serialize_unit(self) -> Result<(), Error> {
470 key_must_be_a_string()
471 }
serialize_unit_struct(self, _name: &'static str) -> Result<(), Error>472 fn serialize_unit_struct(self, _name: &'static str) -> Result<(), Error> {
473 key_must_be_a_string()
474 }
serialize_newtype_variant<T: ?Sized>( self, _name: &'static str, _variant_index: u32, _variant: &'static str, _value: &T, ) -> Result<(), Error> where T: Serialize,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 }
serialize_none(self) -> Result<(), Error>487 fn serialize_none(self) -> Result<(), Error> {
488 key_must_be_a_string()
489 }
serialize_some<T: ?Sized>(self, _value: &T) -> Result<(), Error> where T: Serialize,490 fn serialize_some<T: ?Sized>(self, _value: &T) -> Result<(), Error>
491 where
492 T: Serialize,
493 {
494 key_must_be_a_string()
495 }
serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Error>496 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Error> {
497 key_must_be_a_string()
498 }
serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Error>499 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Error> {
500 key_must_be_a_string()
501 }
serialize_tuple_struct( self, _name: &'static str, _len: usize, ) -> Result<Self::SerializeTupleStruct, Error>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 }
serialize_tuple_variant( self, _name: &'static str, _variant_index: u32, _variant: &'static str, _len: usize, ) -> Result<Self::SerializeTupleVariant, Error>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 }
serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Error>518 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Error> {
519 key_must_be_a_string()
520 }
serialize_struct( self, _name: &'static str, _len: usize, ) -> Result<Self::SerializeStruct, Error>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 }
serialize_struct_variant( self, _name: &'static str, _variant_index: u32, _variant: &'static str, _len: usize, ) -> Result<Self::SerializeStructVariant, Error>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 }
538