1 use crate::error::Error;
2 use crate::token::Token;
3 use serde::ser::{self, Serialize};
4 
5 /// A `Serializer` that ensures that a value serializes to a given list of
6 /// tokens.
7 #[derive(Debug)]
8 pub struct Serializer<'a> {
9     tokens: &'a [Token],
10 }
11 
12 impl<'a> Serializer<'a> {
13     /// Creates the serializer.
new(tokens: &'a [Token]) -> Self14     pub fn new(tokens: &'a [Token]) -> Self {
15         Serializer { tokens }
16     }
17 
18     /// Pulls the next token off of the serializer, ignoring it.
next_token(&mut self) -> Option<Token>19     fn next_token(&mut self) -> Option<Token> {
20         if let Some((&first, rest)) = self.tokens.split_first() {
21             self.tokens = rest;
22             Some(first)
23         } else {
24             None
25         }
26     }
27 
remaining(&self) -> usize28     pub fn remaining(&self) -> usize {
29         self.tokens.len()
30     }
31 }
32 
33 macro_rules! assert_next_token {
34     ($ser:expr, $actual:ident) => {{
35         assert_next_token!($ser, stringify!($actual), Token::$actual, true);
36     }};
37     ($ser:expr, $actual:ident($v:expr)) => {{
38         assert_next_token!(
39             $ser,
40             format_args!(concat!(stringify!($actual), "({:?})"), $v),
41             Token::$actual(v),
42             v == $v
43         );
44     }};
45     ($ser:expr, $actual:ident { $($k:ident),* }) => {{
46         let compare = ($($k,)*);
47         let field_format = || {
48             use std::fmt::Write;
49             let mut buffer = String::new();
50             $(
51                 write!(&mut buffer, concat!(stringify!($k), ": {:?}, "), $k).unwrap();
52             )*
53             buffer
54         };
55         assert_next_token!(
56             $ser,
57             format_args!(concat!(stringify!($actual), " {{ {}}}"), field_format()),
58             Token::$actual { $($k),* },
59             ($($k,)*) == compare
60         );
61     }};
62     ($ser:expr, $actual:expr, $pat:pat, $guard:expr) => {
63         match $ser.next_token() {
64             Some($pat) if $guard => {}
65             Some(expected) => return Err(ser::Error::custom(
66                 format!("expected Token::{} but serialized as {}", expected, $actual)
67             )),
68             None => return Err(ser::Error::custom(
69                 format!("expected end of tokens, but {} was serialized", $actual)
70             )),
71         }
72     };
73 }
74 
75 impl<'s, 'a> ser::Serializer for &'s mut Serializer<'a> {
76     type Ok = ();
77     type Error = Error;
78 
79     type SerializeSeq = Self;
80     type SerializeTuple = Self;
81     type SerializeTupleStruct = Self;
82     type SerializeTupleVariant = Variant<'s, 'a>;
83     type SerializeMap = Self;
84     type SerializeStruct = Self;
85     type SerializeStructVariant = Variant<'s, 'a>;
86 
serialize_bool(self, v: bool) -> Result<(), Error>87     fn serialize_bool(self, v: bool) -> Result<(), Error> {
88         assert_next_token!(self, Bool(v));
89         Ok(())
90     }
91 
serialize_i8(self, v: i8) -> Result<(), Error>92     fn serialize_i8(self, v: i8) -> Result<(), Error> {
93         assert_next_token!(self, I8(v));
94         Ok(())
95     }
96 
serialize_i16(self, v: i16) -> Result<(), Error>97     fn serialize_i16(self, v: i16) -> Result<(), Error> {
98         assert_next_token!(self, I16(v));
99         Ok(())
100     }
101 
serialize_i32(self, v: i32) -> Result<(), Error>102     fn serialize_i32(self, v: i32) -> Result<(), Error> {
103         assert_next_token!(self, I32(v));
104         Ok(())
105     }
106 
serialize_i64(self, v: i64) -> Result<(), Error>107     fn serialize_i64(self, v: i64) -> Result<(), Error> {
108         assert_next_token!(self, I64(v));
109         Ok(())
110     }
111 
serialize_u8(self, v: u8) -> Result<(), Error>112     fn serialize_u8(self, v: u8) -> Result<(), Error> {
113         assert_next_token!(self, U8(v));
114         Ok(())
115     }
116 
serialize_u16(self, v: u16) -> Result<(), Error>117     fn serialize_u16(self, v: u16) -> Result<(), Error> {
118         assert_next_token!(self, U16(v));
119         Ok(())
120     }
121 
serialize_u32(self, v: u32) -> Result<(), Error>122     fn serialize_u32(self, v: u32) -> Result<(), Error> {
123         assert_next_token!(self, U32(v));
124         Ok(())
125     }
126 
serialize_u64(self, v: u64) -> Result<(), Error>127     fn serialize_u64(self, v: u64) -> Result<(), Error> {
128         assert_next_token!(self, U64(v));
129         Ok(())
130     }
131 
serialize_f32(self, v: f32) -> Result<(), Error>132     fn serialize_f32(self, v: f32) -> Result<(), Error> {
133         assert_next_token!(self, F32(v));
134         Ok(())
135     }
136 
serialize_f64(self, v: f64) -> Result<(), Error>137     fn serialize_f64(self, v: f64) -> Result<(), Error> {
138         assert_next_token!(self, F64(v));
139         Ok(())
140     }
141 
serialize_char(self, v: char) -> Result<(), Error>142     fn serialize_char(self, v: char) -> Result<(), Error> {
143         assert_next_token!(self, Char(v));
144         Ok(())
145     }
146 
serialize_str(self, v: &str) -> Result<(), Error>147     fn serialize_str(self, v: &str) -> Result<(), Error> {
148         match self.tokens.first() {
149             Some(&Token::BorrowedStr(_)) => assert_next_token!(self, BorrowedStr(v)),
150             Some(&Token::String(_)) => assert_next_token!(self, String(v)),
151             _ => assert_next_token!(self, Str(v)),
152         }
153         Ok(())
154     }
155 
serialize_bytes(self, v: &[u8]) -> Result<(), Self::Error>156     fn serialize_bytes(self, v: &[u8]) -> Result<(), Self::Error> {
157         match self.tokens.first() {
158             Some(&Token::BorrowedBytes(_)) => assert_next_token!(self, BorrowedBytes(v)),
159             Some(&Token::ByteBuf(_)) => assert_next_token!(self, ByteBuf(v)),
160             _ => assert_next_token!(self, Bytes(v)),
161         }
162         Ok(())
163     }
164 
serialize_unit(self) -> Result<(), Error>165     fn serialize_unit(self) -> Result<(), Error> {
166         assert_next_token!(self, Unit);
167         Ok(())
168     }
169 
serialize_unit_struct(self, name: &'static str) -> Result<(), Error>170     fn serialize_unit_struct(self, name: &'static str) -> Result<(), Error> {
171         assert_next_token!(self, UnitStruct { name });
172         Ok(())
173     }
174 
serialize_unit_variant( self, name: &'static str, _variant_index: u32, variant: &'static str, ) -> Result<(), Error>175     fn serialize_unit_variant(
176         self,
177         name: &'static str,
178         _variant_index: u32,
179         variant: &'static str,
180     ) -> Result<(), Error> {
181         if self.tokens.first() == Some(&Token::Enum { name }) {
182             self.next_token();
183             assert_next_token!(self, Str(variant));
184             assert_next_token!(self, Unit);
185         } else {
186             assert_next_token!(self, UnitVariant { name, variant });
187         }
188         Ok(())
189     }
190 
serialize_newtype_struct<T: ?Sized>(self, name: &'static str, value: &T) -> Result<(), Error> where T: Serialize,191     fn serialize_newtype_struct<T: ?Sized>(self, name: &'static str, value: &T) -> Result<(), Error>
192     where
193         T: Serialize,
194     {
195         assert_next_token!(self, NewtypeStruct { name });
196         value.serialize(self)
197     }
198 
serialize_newtype_variant<T: ?Sized>( self, name: &'static str, _variant_index: u32, variant: &'static str, value: &T, ) -> Result<(), Error> where T: Serialize,199     fn serialize_newtype_variant<T: ?Sized>(
200         self,
201         name: &'static str,
202         _variant_index: u32,
203         variant: &'static str,
204         value: &T,
205     ) -> Result<(), Error>
206     where
207         T: Serialize,
208     {
209         if self.tokens.first() == Some(&Token::Enum { name }) {
210             self.next_token();
211             assert_next_token!(self, Str(variant));
212         } else {
213             assert_next_token!(self, NewtypeVariant { name, variant });
214         }
215         value.serialize(self)
216     }
217 
serialize_none(self) -> Result<(), Error>218     fn serialize_none(self) -> Result<(), Error> {
219         assert_next_token!(self, None);
220         Ok(())
221     }
222 
serialize_some<T: ?Sized>(self, value: &T) -> Result<(), Error> where T: Serialize,223     fn serialize_some<T: ?Sized>(self, value: &T) -> Result<(), Error>
224     where
225         T: Serialize,
226     {
227         assert_next_token!(self, Some);
228         value.serialize(self)
229     }
230 
serialize_seq(self, len: Option<usize>) -> Result<Self, Error>231     fn serialize_seq(self, len: Option<usize>) -> Result<Self, Error> {
232         assert_next_token!(self, Seq { len });
233         Ok(self)
234     }
235 
serialize_tuple(self, len: usize) -> Result<Self, Error>236     fn serialize_tuple(self, len: usize) -> Result<Self, Error> {
237         assert_next_token!(self, Tuple { len });
238         Ok(self)
239     }
240 
serialize_tuple_struct(self, name: &'static str, len: usize) -> Result<Self, Error>241     fn serialize_tuple_struct(self, name: &'static str, len: usize) -> Result<Self, Error> {
242         assert_next_token!(self, TupleStruct { name, len });
243         Ok(self)
244     }
245 
serialize_tuple_variant( self, name: &'static str, _variant_index: u32, variant: &'static str, len: usize, ) -> Result<Self::SerializeTupleVariant, Error>246     fn serialize_tuple_variant(
247         self,
248         name: &'static str,
249         _variant_index: u32,
250         variant: &'static str,
251         len: usize,
252     ) -> Result<Self::SerializeTupleVariant, Error> {
253         if self.tokens.first() == Some(&Token::Enum { name }) {
254             self.next_token();
255             assert_next_token!(self, Str(variant));
256             let len = Some(len);
257             assert_next_token!(self, Seq { len });
258             Ok(Variant {
259                 ser: self,
260                 end: Token::SeqEnd,
261             })
262         } else {
263             assert_next_token!(self, TupleVariant { name, variant, len });
264             Ok(Variant {
265                 ser: self,
266                 end: Token::TupleVariantEnd,
267             })
268         }
269     }
270 
serialize_map(self, len: Option<usize>) -> Result<Self, Error>271     fn serialize_map(self, len: Option<usize>) -> Result<Self, Error> {
272         assert_next_token!(self, Map { len });
273         Ok(self)
274     }
275 
serialize_struct(self, name: &'static str, len: usize) -> Result<Self, Error>276     fn serialize_struct(self, name: &'static str, len: usize) -> Result<Self, Error> {
277         assert_next_token!(self, Struct { name, len });
278         Ok(self)
279     }
280 
serialize_struct_variant( self, name: &'static str, _variant_index: u32, variant: &'static str, len: usize, ) -> Result<Self::SerializeStructVariant, Error>281     fn serialize_struct_variant(
282         self,
283         name: &'static str,
284         _variant_index: u32,
285         variant: &'static str,
286         len: usize,
287     ) -> Result<Self::SerializeStructVariant, Error> {
288         if self.tokens.first() == Some(&Token::Enum { name }) {
289             self.next_token();
290             assert_next_token!(self, Str(variant));
291             let len = Some(len);
292             assert_next_token!(self, Map { len });
293             Ok(Variant {
294                 ser: self,
295                 end: Token::MapEnd,
296             })
297         } else {
298             assert_next_token!(self, StructVariant { name, variant, len });
299             Ok(Variant {
300                 ser: self,
301                 end: Token::StructVariantEnd,
302             })
303         }
304     }
305 
is_human_readable(&self) -> bool306     fn is_human_readable(&self) -> bool {
307         panic!(
308             "Types which have different human-readable and compact representations \
309              must explicitly mark their test cases with `serde_test::Configure`"
310         );
311     }
312 }
313 
314 pub struct Variant<'s, 'a: 's> {
315     ser: &'s mut Serializer<'a>,
316     end: Token,
317 }
318 
319 impl<'s, 'a> ser::SerializeSeq for &'s mut Serializer<'a> {
320     type Ok = ();
321     type Error = Error;
322 
serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Error> where T: Serialize,323     fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
324     where
325         T: Serialize,
326     {
327         value.serialize(&mut **self)
328     }
329 
end(self) -> Result<(), Error>330     fn end(self) -> Result<(), Error> {
331         assert_next_token!(self, SeqEnd);
332         Ok(())
333     }
334 }
335 
336 impl<'s, 'a> ser::SerializeTuple for &'s mut Serializer<'a> {
337     type Ok = ();
338     type Error = Error;
339 
serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Error> where T: Serialize,340     fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
341     where
342         T: Serialize,
343     {
344         value.serialize(&mut **self)
345     }
346 
end(self) -> Result<(), Error>347     fn end(self) -> Result<(), Error> {
348         assert_next_token!(self, TupleEnd);
349         Ok(())
350     }
351 }
352 
353 impl<'s, 'a> ser::SerializeTupleStruct for &'s mut Serializer<'a> {
354     type Ok = ();
355     type Error = Error;
356 
serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Error> where T: Serialize,357     fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
358     where
359         T: Serialize,
360     {
361         value.serialize(&mut **self)
362     }
363 
end(self) -> Result<(), Error>364     fn end(self) -> Result<(), Error> {
365         assert_next_token!(self, TupleStructEnd);
366         Ok(())
367     }
368 }
369 
370 impl<'s, 'a> ser::SerializeTupleVariant for Variant<'s, 'a> {
371     type Ok = ();
372     type Error = Error;
373 
serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Error> where T: Serialize,374     fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
375     where
376         T: Serialize,
377     {
378         value.serialize(&mut *self.ser)
379     }
380 
end(self) -> Result<(), Error>381     fn end(self) -> Result<(), Error> {
382         match self.end {
383             Token::TupleVariantEnd => assert_next_token!(self.ser, TupleVariantEnd),
384             Token::SeqEnd => assert_next_token!(self.ser, SeqEnd),
385             _ => unreachable!(),
386         }
387         Ok(())
388     }
389 }
390 
391 impl<'s, 'a> ser::SerializeMap for &'s mut Serializer<'a> {
392     type Ok = ();
393     type Error = Error;
394 
serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), Self::Error> where T: Serialize,395     fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), Self::Error>
396     where
397         T: Serialize,
398     {
399         key.serialize(&mut **self)
400     }
401 
serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> where T: Serialize,402     fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
403     where
404         T: Serialize,
405     {
406         value.serialize(&mut **self)
407     }
408 
end(self) -> Result<(), Self::Error>409     fn end(self) -> Result<(), Self::Error> {
410         assert_next_token!(self, MapEnd);
411         Ok(())
412     }
413 }
414 
415 impl<'s, 'a> ser::SerializeStruct for &'s mut Serializer<'a> {
416     type Ok = ();
417     type Error = Error;
418 
serialize_field<T: ?Sized>( &mut self, key: &'static str, value: &T, ) -> Result<(), Self::Error> where T: Serialize,419     fn serialize_field<T: ?Sized>(
420         &mut self,
421         key: &'static str,
422         value: &T,
423     ) -> Result<(), Self::Error>
424     where
425         T: Serialize,
426     {
427         key.serialize(&mut **self)?;
428         value.serialize(&mut **self)
429     }
430 
end(self) -> Result<(), Self::Error>431     fn end(self) -> Result<(), Self::Error> {
432         assert_next_token!(self, StructEnd);
433         Ok(())
434     }
435 }
436 
437 impl<'s, 'a> ser::SerializeStructVariant for Variant<'s, 'a> {
438     type Ok = ();
439     type Error = Error;
440 
serialize_field<T: ?Sized>( &mut self, key: &'static str, value: &T, ) -> Result<(), Self::Error> where T: Serialize,441     fn serialize_field<T: ?Sized>(
442         &mut self,
443         key: &'static str,
444         value: &T,
445     ) -> Result<(), Self::Error>
446     where
447         T: Serialize,
448     {
449         key.serialize(&mut *self.ser)?;
450         value.serialize(&mut *self.ser)
451     }
452 
end(self) -> Result<(), Self::Error>453     fn end(self) -> Result<(), Self::Error> {
454         match self.end {
455             Token::StructVariantEnd => assert_next_token!(self.ser, StructVariantEnd),
456             Token::MapEnd => assert_next_token!(self.ser, MapEnd),
457             _ => unreachable!(),
458         }
459         Ok(())
460     }
461 }
462