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     }
finish_if_not_nested(&mut self) -> Result<(), Error>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     }
start_vector(&mut self)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     }
start_map(&mut self)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     }
end_vector(&mut self) -> Result<(), Error>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     }
end_map(&mut self) -> Result<(), Error>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 {
fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::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 {
custom<T>(msg: T) -> Self where T: Display,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;
serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> where T: Serialize,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     }
end(self) -> Result<Self::Ok, Self::Error>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;
serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), Self::Error> where T: Serialize,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     }
serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> where T: Serialize,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     }
end(self) -> Result<Self::Ok, Self::Error>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;
serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> where T: Serialize,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     }
end(self) -> Result<Self::Ok, Self::Error>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;
serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> where T: Serialize,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     }
end(self) -> Result<Self::Ok, Self::Error>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;
serialize_field<T: ?Sized>( &mut self, key: &'static str, value: &T, ) -> Result<(), Self::Error> where T: Serialize,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     }
end(self) -> Result<Self::Ok, Self::Error>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;
serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> where T: Serialize,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     }
end(self) -> Result<Self::Ok, Self::Error>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;
serialize_field<T: ?Sized>( &mut self, key: &'static str, value: &T, ) -> Result<(), Self::Error> where T: Serialize,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     }
end(self) -> Result<Self::Ok, Self::Error>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;
is_human_readable(&self) -> bool220     fn is_human_readable(&self) -> bool {
221         cfg!(serialize_human_readable)
222     }
serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error>223     fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
224         self.builder.push(v);
225         self.finish_if_not_nested()
226     }
serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error>227     fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
228         self.builder.push(v);
229         self.finish_if_not_nested()
230     }
serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error>231     fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
232         self.builder.push(v);
233         self.finish_if_not_nested()
234     }
serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error>235     fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
236         self.builder.push(v);
237         self.finish_if_not_nested()
238     }
serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error>239     fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
240         self.builder.push(v);
241         self.finish_if_not_nested()
242     }
serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error>243     fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
244         self.builder.push(v);
245         self.finish_if_not_nested()
246     }
serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error>247     fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
248         self.builder.push(v);
249         self.finish_if_not_nested()
250     }
serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error>251     fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
252         self.builder.push(v);
253         self.finish_if_not_nested()
254     }
serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error>255     fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
256         self.builder.push(v);
257         self.finish_if_not_nested()
258     }
serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error>259     fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
260         self.builder.push(v);
261         self.finish_if_not_nested()
262     }
serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error>263     fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
264         self.builder.push(v);
265         self.finish_if_not_nested()
266     }
serialize_char(self, v: char) -> Result<Self::Ok, Self::Error>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     }
serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error>271     fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
272         self.builder.push(v);
273         self.finish_if_not_nested()
274     }
serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error>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     }
serialize_none(self) -> Result<Self::Ok, Self::Error>279     fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
280         self.builder.push(());
281         self.finish_if_not_nested()
282     }
serialize_some<T: ?Sized>(self, t: &T) -> Result<Self::Ok, Self::Error> where T: Serialize,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     }
serialize_unit(self) -> Result<Self::Ok, Self::Error>289     fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
290         self.builder.push(());
291         self.finish_if_not_nested()
292     }
serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error>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     }
serialize_unit_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, ) -> Result<Self::Ok, Self::Error>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     }
serialize_newtype_struct<T: ?Sized>( self, _name: &'static str, value: &T, ) -> Result<Self::Ok, Self::Error> where T: Serialize,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     }
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,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     }
serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error>331     fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
332         self.start_vector();
333         Ok(self)
334     }
serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error>335     fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
336         self.start_vector();
337         Ok(self)
338     }
serialize_tuple_struct( self, _name: &'static str, _len: usize, ) -> Result<Self::SerializeTupleStruct, Self::Error>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     }
serialize_tuple_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, _len: usize, ) -> Result<Self::SerializeTupleVariant, Self::Error>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     }
serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error>359     fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
360         self.start_map();
361         Ok(self)
362     }
serialize_struct( self, _name: &'static str, _len: usize, ) -> Result<Self::SerializeStruct, Self::Error>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     }
serialize_struct_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, _len: usize, ) -> Result<Self::SerializeStructVariant, Self::Error>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 
key_must_be_a_string<T>() -> Result<T, Error>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]
serialize_str(self, value: &str) -> Result<(), Error>393     fn serialize_str(self, value: &str) -> Result<(), Error> {
394         self.0.builder.push_key(value);
395         Ok(())
396     }
397     #[inline]
serialize_unit_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, ) -> Result<(), Error>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]
serialize_newtype_struct<T: ?Sized>( self, _name: &'static str, value: &T, ) -> Result<(), Error> where T: Serialize,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 
serialize_bool(self, _value: bool) -> Result<(), Error>426     fn serialize_bool(self, _value: bool) -> Result<(), Error> {
427         key_must_be_a_string()
428     }
serialize_i8(self, _value: i8) -> Result<(), Error>429     fn serialize_i8(self, _value: i8) -> Result<(), Error> {
430         key_must_be_a_string()
431     }
serialize_i16(self, _value: i16) -> Result<(), Error>432     fn serialize_i16(self, _value: i16) -> Result<(), Error> {
433         key_must_be_a_string()
434     }
serialize_i32(self, _value: i32) -> Result<(), Error>435     fn serialize_i32(self, _value: i32) -> Result<(), Error> {
436         key_must_be_a_string()
437     }
serialize_i64(self, _value: i64) -> Result<(), Error>438     fn serialize_i64(self, _value: i64) -> Result<(), Error> {
439         key_must_be_a_string()
440     }
serialize_u8(self, _value: u8) -> Result<(), Error>441     fn serialize_u8(self, _value: u8) -> Result<(), Error> {
442         key_must_be_a_string()
443     }
serialize_u16(self, _value: u16) -> Result<(), Error>444     fn serialize_u16(self, _value: u16) -> Result<(), Error> {
445         key_must_be_a_string()
446     }
serialize_u32(self, _value: u32) -> Result<(), Error>447     fn serialize_u32(self, _value: u32) -> Result<(), Error> {
448         key_must_be_a_string()
449     }
serialize_u64(self, _value: u64) -> Result<(), Error>450     fn serialize_u64(self, _value: u64) -> Result<(), Error> {
451         key_must_be_a_string()
452     }
serialize_f32(self, _value: f32) -> Result<(), Error>453     fn serialize_f32(self, _value: f32) -> Result<(), Error> {
454         key_must_be_a_string()
455     }
serialize_f64(self, _value: f64) -> Result<(), Error>456     fn serialize_f64(self, _value: f64) -> Result<(), Error> {
457         key_must_be_a_string()
458     }
serialize_char(self, _value: char) -> Result<(), Error>459     fn serialize_char(self, _value: char) -> Result<(), Error> {
460         key_must_be_a_string()
461     }
serialize_bytes(self, _value: &[u8]) -> Result<(), Error>462     fn serialize_bytes(self, _value: &[u8]) -> Result<(), Error> {
463         key_must_be_a_string()
464     }
serialize_unit(self) -> Result<(), Error>465     fn serialize_unit(self) -> Result<(), Error> {
466         key_must_be_a_string()
467     }
serialize_unit_struct(self, _name: &'static str) -> Result<(), Error>468     fn serialize_unit_struct(self, _name: &'static str) -> Result<(), Error> {
469         key_must_be_a_string()
470     }
serialize_newtype_variant<T: ?Sized>( self, _name: &'static str, _variant_index: u32, _variant: &'static str, _value: &T, ) -> Result<(), Error> where T: Serialize,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     }
serialize_none(self) -> Result<(), Error>483     fn serialize_none(self) -> Result<(), Error> {
484         key_must_be_a_string()
485     }
serialize_some<T: ?Sized>(self, _value: &T) -> Result<(), Error> where T: Serialize,486     fn serialize_some<T: ?Sized>(self, _value: &T) -> Result<(), Error>
487     where
488         T: Serialize,
489     {
490         key_must_be_a_string()
491     }
serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Error>492     fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Error> {
493         key_must_be_a_string()
494     }
serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Error>495     fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Error> {
496         key_must_be_a_string()
497     }
serialize_tuple_struct( self, _name: &'static str, _len: usize, ) -> Result<Self::SerializeTupleStruct, Error>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     }
serialize_tuple_variant( self, _name: &'static str, _variant_index: u32, _variant: &'static str, _len: usize, ) -> Result<Self::SerializeTupleVariant, Error>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     }
serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Error>514     fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Error> {
515         key_must_be_a_string()
516     }
serialize_struct( self, _name: &'static str, _len: usize, ) -> Result<Self::SerializeStruct, Error>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     }
serialize_struct_variant( self, _name: &'static str, _variant_index: u32, _variant: &'static str, _len: usize, ) -> Result<Self::SerializeStructVariant, Error>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 }
534