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