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