1 // This module is doc(hidden) and nothing here should be used outside of 2 // generated code. 3 // 4 // We will iterate on the implementation for a few releases and only have to 5 // worry about backward compatibility for the `untagged` and `tag` attributes 6 // rather than for this entire mechanism. 7 // 8 // This issue is tracking making some of this stuff public: 9 // https://github.com/serde-rs/serde/issues/741 10 11 #![doc(hidden)] 12 13 use core::cmp; 14 use core::fmt; 15 use core::marker::PhantomData; 16 17 #[cfg(all(not(feature = "std"), feature = "collections"))] 18 use collections::{String, Vec}; 19 20 #[cfg(all(feature = "alloc", not(feature = "std")))] 21 use alloc::boxed::Box; 22 23 use de::{self, Deserialize, DeserializeSeed, Deserializer, Visitor, SeqVisitor, MapVisitor, 24 EnumVisitor, Unexpected}; 25 26 /// Used from generated code to buffer the contents of the Deserializer when 27 /// deserializing untagged enums and internally tagged enums. 28 /// 29 /// Not public API. Use serde-value instead. 30 #[derive(Debug)] 31 pub enum Content { 32 Bool(bool), 33 34 U8(u8), 35 U16(u16), 36 U32(u32), 37 U64(u64), 38 39 I8(i8), 40 I16(i16), 41 I32(i32), 42 I64(i64), 43 44 F32(f32), 45 F64(f64), 46 47 Char(char), 48 String(String), 49 Bytes(Vec<u8>), 50 51 None, 52 Some(Box<Content>), 53 54 Unit, 55 Newtype(Box<Content>), 56 Seq(Vec<Content>), 57 Map(Vec<(Content, Content)>), 58 } 59 60 impl Content { unexpected(&self) -> Unexpected61 fn unexpected(&self) -> Unexpected { 62 match *self { 63 Content::Bool(b) => Unexpected::Bool(b), 64 Content::U8(n) => Unexpected::Unsigned(n as u64), 65 Content::U16(n) => Unexpected::Unsigned(n as u64), 66 Content::U32(n) => Unexpected::Unsigned(n as u64), 67 Content::U64(n) => Unexpected::Unsigned(n), 68 Content::I8(n) => Unexpected::Signed(n as i64), 69 Content::I16(n) => Unexpected::Signed(n as i64), 70 Content::I32(n) => Unexpected::Signed(n as i64), 71 Content::I64(n) => Unexpected::Signed(n), 72 Content::F32(f) => Unexpected::Float(f as f64), 73 Content::F64(f) => Unexpected::Float(f), 74 Content::Char(c) => Unexpected::Char(c), 75 Content::String(ref s) => Unexpected::Str(s), 76 Content::Bytes(ref b) => Unexpected::Bytes(b), 77 Content::None | Content::Some(_) => Unexpected::Option, 78 Content::Unit => Unexpected::Unit, 79 Content::Newtype(_) => Unexpected::NewtypeStruct, 80 Content::Seq(_) => Unexpected::Seq, 81 Content::Map(_) => Unexpected::Map, 82 } 83 } 84 } 85 86 impl Deserialize for Content { deserialize<D: Deserializer>(deserializer: D) -> Result<Self, D::Error>87 fn deserialize<D: Deserializer>(deserializer: D) -> Result<Self, D::Error> { 88 // Untagged and internally tagged enums are only supported in 89 // self-describing formats. 90 deserializer.deserialize(ContentVisitor) 91 } 92 } 93 94 struct ContentVisitor; 95 96 impl Visitor for ContentVisitor { 97 type Value = Content; 98 expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result99 fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result { 100 fmt.write_str("any value") 101 } 102 visit_bool<F>(self, value: bool) -> Result<Self::Value, F> where F: de::Error103 fn visit_bool<F>(self, value: bool) -> Result<Self::Value, F> 104 where F: de::Error 105 { 106 Ok(Content::Bool(value)) 107 } 108 visit_i8<F>(self, value: i8) -> Result<Self::Value, F> where F: de::Error109 fn visit_i8<F>(self, value: i8) -> Result<Self::Value, F> 110 where F: de::Error 111 { 112 Ok(Content::I8(value)) 113 } 114 visit_i16<F>(self, value: i16) -> Result<Self::Value, F> where F: de::Error115 fn visit_i16<F>(self, value: i16) -> Result<Self::Value, F> 116 where F: de::Error 117 { 118 Ok(Content::I16(value)) 119 } 120 visit_i32<F>(self, value: i32) -> Result<Self::Value, F> where F: de::Error121 fn visit_i32<F>(self, value: i32) -> Result<Self::Value, F> 122 where F: de::Error 123 { 124 Ok(Content::I32(value)) 125 } 126 visit_i64<F>(self, value: i64) -> Result<Self::Value, F> where F: de::Error127 fn visit_i64<F>(self, value: i64) -> Result<Self::Value, F> 128 where F: de::Error 129 { 130 Ok(Content::I64(value)) 131 } 132 visit_u8<F>(self, value: u8) -> Result<Self::Value, F> where F: de::Error133 fn visit_u8<F>(self, value: u8) -> Result<Self::Value, F> 134 where F: de::Error 135 { 136 Ok(Content::U8(value)) 137 } 138 visit_u16<F>(self, value: u16) -> Result<Self::Value, F> where F: de::Error139 fn visit_u16<F>(self, value: u16) -> Result<Self::Value, F> 140 where F: de::Error 141 { 142 Ok(Content::U16(value)) 143 } 144 visit_u32<F>(self, value: u32) -> Result<Self::Value, F> where F: de::Error145 fn visit_u32<F>(self, value: u32) -> Result<Self::Value, F> 146 where F: de::Error 147 { 148 Ok(Content::U32(value)) 149 } 150 visit_u64<F>(self, value: u64) -> Result<Self::Value, F> where F: de::Error151 fn visit_u64<F>(self, value: u64) -> Result<Self::Value, F> 152 where F: de::Error 153 { 154 Ok(Content::U64(value)) 155 } 156 visit_f32<F>(self, value: f32) -> Result<Self::Value, F> where F: de::Error157 fn visit_f32<F>(self, value: f32) -> Result<Self::Value, F> 158 where F: de::Error 159 { 160 Ok(Content::F32(value)) 161 } 162 visit_f64<F>(self, value: f64) -> Result<Self::Value, F> where F: de::Error163 fn visit_f64<F>(self, value: f64) -> Result<Self::Value, F> 164 where F: de::Error 165 { 166 Ok(Content::F64(value)) 167 } 168 visit_char<F>(self, value: char) -> Result<Self::Value, F> where F: de::Error169 fn visit_char<F>(self, value: char) -> Result<Self::Value, F> 170 where F: de::Error 171 { 172 Ok(Content::Char(value)) 173 } 174 visit_str<F>(self, value: &str) -> Result<Self::Value, F> where F: de::Error175 fn visit_str<F>(self, value: &str) -> Result<Self::Value, F> 176 where F: de::Error 177 { 178 Ok(Content::String(value.into())) 179 } 180 visit_string<F>(self, value: String) -> Result<Self::Value, F> where F: de::Error181 fn visit_string<F>(self, value: String) -> Result<Self::Value, F> 182 where F: de::Error 183 { 184 Ok(Content::String(value)) 185 } 186 visit_bytes<F>(self, value: &[u8]) -> Result<Self::Value, F> where F: de::Error187 fn visit_bytes<F>(self, value: &[u8]) -> Result<Self::Value, F> 188 where F: de::Error 189 { 190 Ok(Content::Bytes(value.into())) 191 } 192 visit_byte_buf<F>(self, value: Vec<u8>) -> Result<Self::Value, F> where F: de::Error193 fn visit_byte_buf<F>(self, value: Vec<u8>) -> Result<Self::Value, F> 194 where F: de::Error 195 { 196 Ok(Content::Bytes(value)) 197 } 198 visit_unit<F>(self) -> Result<Self::Value, F> where F: de::Error199 fn visit_unit<F>(self) -> Result<Self::Value, F> 200 where F: de::Error 201 { 202 Ok(Content::Unit) 203 } 204 visit_none<F>(self) -> Result<Self::Value, F> where F: de::Error205 fn visit_none<F>(self) -> Result<Self::Value, F> 206 where F: de::Error 207 { 208 Ok(Content::None) 209 } 210 visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer211 fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error> 212 where D: Deserializer 213 { 214 Deserialize::deserialize(deserializer).map(|v| Content::Some(Box::new(v))) 215 } 216 visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer217 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error> 218 where D: Deserializer 219 { 220 Deserialize::deserialize(deserializer).map(|v| Content::Newtype(Box::new(v))) 221 } 222 visit_seq<V>(self, mut visitor: V) -> Result<Self::Value, V::Error> where V: SeqVisitor223 fn visit_seq<V>(self, mut visitor: V) -> Result<Self::Value, V::Error> 224 where V: SeqVisitor 225 { 226 let mut vec = Vec::with_capacity(cmp::min(visitor.size_hint().0, 4096)); 227 while let Some(e) = try!(visitor.visit()) { 228 vec.push(e); 229 } 230 Ok(Content::Seq(vec)) 231 } 232 visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error> where V: MapVisitor233 fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error> 234 where V: MapVisitor 235 { 236 let mut vec = Vec::with_capacity(cmp::min(visitor.size_hint().0, 4096)); 237 while let Some(kv) = try!(visitor.visit()) { 238 vec.push(kv); 239 } 240 Ok(Content::Map(vec)) 241 } 242 visit_enum<V>(self, _visitor: V) -> Result<Self::Value, V::Error> where V: EnumVisitor243 fn visit_enum<V>(self, _visitor: V) -> Result<Self::Value, V::Error> 244 where V: EnumVisitor 245 { 246 Err(de::Error::custom("untagged and internally tagged enums do not support enum input")) 247 } 248 } 249 250 /// This is the type of the map keys in an internally tagged enum. 251 /// 252 /// Not public API. 253 pub enum TagOrContent { 254 Tag, 255 Content(Content), 256 } 257 258 struct TagOrContentVisitor { 259 name: &'static str, 260 } 261 262 impl TagOrContentVisitor { new(name: &'static str) -> Self263 fn new(name: &'static str) -> Self { 264 TagOrContentVisitor { name: name } 265 } 266 } 267 268 impl DeserializeSeed for TagOrContentVisitor { 269 type Value = TagOrContent; 270 deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer271 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> 272 where D: Deserializer 273 { 274 // Internally tagged enums are only supported in self-describing 275 // formats. 276 deserializer.deserialize(self) 277 } 278 } 279 280 impl Visitor for TagOrContentVisitor { 281 type Value = TagOrContent; 282 expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result283 fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result { 284 write!(fmt, "a type tag `{}` or any other value", self.name) 285 } 286 visit_bool<F>(self, value: bool) -> Result<Self::Value, F> where F: de::Error287 fn visit_bool<F>(self, value: bool) -> Result<Self::Value, F> 288 where F: de::Error 289 { 290 ContentVisitor.visit_bool(value).map(TagOrContent::Content) 291 } 292 visit_i8<F>(self, value: i8) -> Result<Self::Value, F> where F: de::Error293 fn visit_i8<F>(self, value: i8) -> Result<Self::Value, F> 294 where F: de::Error 295 { 296 ContentVisitor.visit_i8(value).map(TagOrContent::Content) 297 } 298 visit_i16<F>(self, value: i16) -> Result<Self::Value, F> where F: de::Error299 fn visit_i16<F>(self, value: i16) -> Result<Self::Value, F> 300 where F: de::Error 301 { 302 ContentVisitor.visit_i16(value).map(TagOrContent::Content) 303 } 304 visit_i32<F>(self, value: i32) -> Result<Self::Value, F> where F: de::Error305 fn visit_i32<F>(self, value: i32) -> Result<Self::Value, F> 306 where F: de::Error 307 { 308 ContentVisitor.visit_i32(value).map(TagOrContent::Content) 309 } 310 visit_i64<F>(self, value: i64) -> Result<Self::Value, F> where F: de::Error311 fn visit_i64<F>(self, value: i64) -> Result<Self::Value, F> 312 where F: de::Error 313 { 314 ContentVisitor.visit_i64(value).map(TagOrContent::Content) 315 } 316 visit_u8<F>(self, value: u8) -> Result<Self::Value, F> where F: de::Error317 fn visit_u8<F>(self, value: u8) -> Result<Self::Value, F> 318 where F: de::Error 319 { 320 ContentVisitor.visit_u8(value).map(TagOrContent::Content) 321 } 322 visit_u16<F>(self, value: u16) -> Result<Self::Value, F> where F: de::Error323 fn visit_u16<F>(self, value: u16) -> Result<Self::Value, F> 324 where F: de::Error 325 { 326 ContentVisitor.visit_u16(value).map(TagOrContent::Content) 327 } 328 visit_u32<F>(self, value: u32) -> Result<Self::Value, F> where F: de::Error329 fn visit_u32<F>(self, value: u32) -> Result<Self::Value, F> 330 where F: de::Error 331 { 332 ContentVisitor.visit_u32(value).map(TagOrContent::Content) 333 } 334 visit_u64<F>(self, value: u64) -> Result<Self::Value, F> where F: de::Error335 fn visit_u64<F>(self, value: u64) -> Result<Self::Value, F> 336 where F: de::Error 337 { 338 ContentVisitor.visit_u64(value).map(TagOrContent::Content) 339 } 340 visit_f32<F>(self, value: f32) -> Result<Self::Value, F> where F: de::Error341 fn visit_f32<F>(self, value: f32) -> Result<Self::Value, F> 342 where F: de::Error 343 { 344 ContentVisitor.visit_f32(value).map(TagOrContent::Content) 345 } 346 visit_f64<F>(self, value: f64) -> Result<Self::Value, F> where F: de::Error347 fn visit_f64<F>(self, value: f64) -> Result<Self::Value, F> 348 where F: de::Error 349 { 350 ContentVisitor.visit_f64(value).map(TagOrContent::Content) 351 } 352 visit_char<F>(self, value: char) -> Result<Self::Value, F> where F: de::Error353 fn visit_char<F>(self, value: char) -> Result<Self::Value, F> 354 where F: de::Error 355 { 356 ContentVisitor.visit_char(value).map(TagOrContent::Content) 357 } 358 visit_str<F>(self, value: &str) -> Result<Self::Value, F> where F: de::Error359 fn visit_str<F>(self, value: &str) -> Result<Self::Value, F> 360 where F: de::Error 361 { 362 if value == self.name { 363 Ok(TagOrContent::Tag) 364 } else { 365 ContentVisitor.visit_str(value).map(TagOrContent::Content) 366 } 367 } 368 visit_string<F>(self, value: String) -> Result<Self::Value, F> where F: de::Error369 fn visit_string<F>(self, value: String) -> Result<Self::Value, F> 370 where F: de::Error 371 { 372 if value == self.name { 373 Ok(TagOrContent::Tag) 374 } else { 375 ContentVisitor.visit_string(value).map(TagOrContent::Content) 376 } 377 } 378 visit_bytes<F>(self, value: &[u8]) -> Result<Self::Value, F> where F: de::Error379 fn visit_bytes<F>(self, value: &[u8]) -> Result<Self::Value, F> 380 where F: de::Error 381 { 382 if value == self.name.as_bytes() { 383 Ok(TagOrContent::Tag) 384 } else { 385 ContentVisitor.visit_bytes(value).map(TagOrContent::Content) 386 } 387 } 388 visit_byte_buf<F>(self, value: Vec<u8>) -> Result<Self::Value, F> where F: de::Error389 fn visit_byte_buf<F>(self, value: Vec<u8>) -> Result<Self::Value, F> 390 where F: de::Error 391 { 392 if value == self.name.as_bytes() { 393 Ok(TagOrContent::Tag) 394 } else { 395 ContentVisitor.visit_byte_buf(value).map(TagOrContent::Content) 396 } 397 } 398 visit_unit<F>(self) -> Result<Self::Value, F> where F: de::Error399 fn visit_unit<F>(self) -> Result<Self::Value, F> 400 where F: de::Error 401 { 402 ContentVisitor.visit_unit().map(TagOrContent::Content) 403 } 404 visit_none<F>(self) -> Result<Self::Value, F> where F: de::Error405 fn visit_none<F>(self) -> Result<Self::Value, F> 406 where F: de::Error 407 { 408 ContentVisitor.visit_none().map(TagOrContent::Content) 409 } 410 visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer411 fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error> 412 where D: Deserializer 413 { 414 ContentVisitor.visit_some(deserializer).map(TagOrContent::Content) 415 } 416 visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer417 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error> 418 where D: Deserializer 419 { 420 ContentVisitor.visit_newtype_struct(deserializer).map(TagOrContent::Content) 421 } 422 visit_seq<V>(self, visitor: V) -> Result<Self::Value, V::Error> where V: SeqVisitor423 fn visit_seq<V>(self, visitor: V) -> Result<Self::Value, V::Error> 424 where V: SeqVisitor 425 { 426 ContentVisitor.visit_seq(visitor).map(TagOrContent::Content) 427 } 428 visit_map<V>(self, visitor: V) -> Result<Self::Value, V::Error> where V: MapVisitor429 fn visit_map<V>(self, visitor: V) -> Result<Self::Value, V::Error> 430 where V: MapVisitor 431 { 432 ContentVisitor.visit_map(visitor).map(TagOrContent::Content) 433 } 434 visit_enum<V>(self, visitor: V) -> Result<Self::Value, V::Error> where V: EnumVisitor435 fn visit_enum<V>(self, visitor: V) -> Result<Self::Value, V::Error> 436 where V: EnumVisitor 437 { 438 ContentVisitor.visit_enum(visitor).map(TagOrContent::Content) 439 } 440 } 441 442 /// Used by generated code to deserialize an internally tagged enum. 443 /// 444 /// Not public API. 445 pub struct TaggedContent<T> { 446 pub tag: T, 447 pub content: Content, 448 } 449 450 /// Not public API. 451 pub struct TaggedContentVisitor<T> { 452 tag_name: &'static str, 453 tag: PhantomData<T>, 454 } 455 456 impl<T> TaggedContentVisitor<T> { 457 /// Visitor for the content of an internally tagged enum with the given tag 458 /// name. new(name: &'static str) -> Self459 pub fn new(name: &'static str) -> Self { 460 TaggedContentVisitor { 461 tag_name: name, 462 tag: PhantomData, 463 } 464 } 465 } 466 467 impl<T> DeserializeSeed for TaggedContentVisitor<T> 468 where T: Deserialize 469 { 470 type Value = TaggedContent<T>; 471 deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer472 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> 473 where D: Deserializer 474 { 475 // Internally tagged enums are only supported in self-describing 476 // formats. 477 deserializer.deserialize(self) 478 } 479 } 480 481 impl<T> Visitor for TaggedContentVisitor<T> 482 where T: Deserialize 483 { 484 type Value = TaggedContent<T>; 485 expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result486 fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result { 487 fmt.write_str("any value") 488 } 489 visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error> where V: MapVisitor490 fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error> 491 where V: MapVisitor 492 { 493 let mut tag = None; 494 let mut vec = Vec::with_capacity(cmp::min(visitor.size_hint().0, 4096)); 495 while let Some(k) = try!(visitor.visit_key_seed(TagOrContentVisitor::new(self.tag_name))) { 496 match k { 497 TagOrContent::Tag => { 498 if tag.is_some() { 499 return Err(de::Error::duplicate_field(self.tag_name)); 500 } 501 tag = Some(try!(visitor.visit_value())); 502 } 503 TagOrContent::Content(k) => { 504 let v = try!(visitor.visit_value()); 505 vec.push((k, v)); 506 } 507 } 508 } 509 match tag { 510 None => Err(de::Error::missing_field(self.tag_name)), 511 Some(tag) => { 512 Ok(TaggedContent { 513 tag: tag, 514 content: Content::Map(vec), 515 }) 516 } 517 } 518 } 519 } 520 521 /// Used by generated code to deserialize an adjacently tagged enum. 522 /// 523 /// Not public API. 524 pub enum TagOrContentField { 525 Tag, 526 Content, 527 } 528 529 /// Not public API. 530 pub struct TagOrContentFieldVisitor { 531 pub tag: &'static str, 532 pub content: &'static str, 533 } 534 535 impl DeserializeSeed for TagOrContentFieldVisitor { 536 type Value = TagOrContentField; 537 deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer538 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> 539 where D: Deserializer 540 { 541 deserializer.deserialize_str(self) 542 } 543 } 544 545 impl Visitor for TagOrContentFieldVisitor { 546 type Value = TagOrContentField; 547 expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result548 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 549 write!(formatter, "{:?} or {:?}", self.tag, self.content) 550 } 551 visit_str<E>(self, field: &str) -> Result<Self::Value, E> where E: de::Error552 fn visit_str<E>(self, field: &str) -> Result<Self::Value, E> 553 where E: de::Error 554 { 555 if field == self.tag { 556 Ok(TagOrContentField::Tag) 557 } else if field == self.content { 558 Ok(TagOrContentField::Content) 559 } else { 560 Err(de::Error::invalid_value(Unexpected::Str(field), &self)) 561 } 562 } 563 } 564 565 /// Not public API 566 pub struct ContentDeserializer<E> { 567 content: Content, 568 err: PhantomData<E>, 569 } 570 571 /// Used when deserializing an internally tagged enum because the content will 572 /// be used exactly once. 573 impl<E> Deserializer for ContentDeserializer<E> 574 where E: de::Error 575 { 576 type Error = E; 577 deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor578 fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error> 579 where V: Visitor 580 { 581 match self.content { 582 Content::Bool(v) => visitor.visit_bool(v), 583 Content::U8(v) => visitor.visit_u8(v), 584 Content::U16(v) => visitor.visit_u16(v), 585 Content::U32(v) => visitor.visit_u32(v), 586 Content::U64(v) => visitor.visit_u64(v), 587 Content::I8(v) => visitor.visit_i8(v), 588 Content::I16(v) => visitor.visit_i16(v), 589 Content::I32(v) => visitor.visit_i32(v), 590 Content::I64(v) => visitor.visit_i64(v), 591 Content::F32(v) => visitor.visit_f32(v), 592 Content::F64(v) => visitor.visit_f64(v), 593 Content::Char(v) => visitor.visit_char(v), 594 Content::String(v) => visitor.visit_string(v), 595 Content::Unit => visitor.visit_unit(), 596 Content::None => visitor.visit_none(), 597 Content::Some(v) => visitor.visit_some(ContentDeserializer::new(*v)), 598 Content::Newtype(v) => visitor.visit_newtype_struct(ContentDeserializer::new(*v)), 599 Content::Seq(v) => { 600 let seq = v.into_iter().map(ContentDeserializer::new); 601 let mut seq_visitor = de::value::SeqDeserializer::new(seq); 602 let value = try!(visitor.visit_seq(&mut seq_visitor)); 603 try!(seq_visitor.end()); 604 Ok(value) 605 } 606 Content::Map(v) => { 607 let map = v.into_iter().map(|(k, v)| { 608 (ContentDeserializer::new(k), 609 ContentDeserializer::new(v)) 610 }); 611 let mut map_visitor = de::value::MapDeserializer::new(map); 612 let value = try!(visitor.visit_map(&mut map_visitor)); 613 try!(map_visitor.end()); 614 Ok(value) 615 } 616 Content::Bytes(v) => visitor.visit_byte_buf(v), 617 } 618 } 619 deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor620 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error> 621 where V: Visitor 622 { 623 match self.content { 624 Content::None => visitor.visit_none(), 625 Content::Some(v) => visitor.visit_some(ContentDeserializer::new(*v)), 626 Content::Unit => visitor.visit_unit(), 627 _ => visitor.visit_some(self), 628 } 629 } 630 deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor631 fn deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value, Self::Error> 632 where V: Visitor 633 { 634 visitor.visit_newtype_struct(self) 635 } 636 deserialize_enum<V>(self, _name: &str, _variants: &'static [&'static str], visitor: V) -> Result<V::Value, Self::Error> where V: Visitor637 fn deserialize_enum<V>(self, 638 _name: &str, 639 _variants: &'static [&'static str], 640 visitor: V) 641 -> Result<V::Value, Self::Error> 642 where V: Visitor 643 { 644 let (variant, value) = match self.content { 645 Content::Map(value) => { 646 let mut iter = value.into_iter(); 647 let (variant, value) = match iter.next() { 648 Some(v) => v, 649 None => { 650 return Err(de::Error::invalid_value(de::Unexpected::Map, 651 &"map with a single key")); 652 } 653 }; 654 // enums are encoded in json as maps with a single key:value pair 655 if iter.next().is_some() { 656 return Err(de::Error::invalid_value(de::Unexpected::Map, 657 &"map with a single key")); 658 } 659 (variant, Some(value)) 660 } 661 Content::String(variant) => (Content::String(variant), None), 662 other => { 663 return Err(de::Error::invalid_type(other.unexpected(), &"string or map")); 664 } 665 }; 666 667 visitor.visit_enum(EnumDeserializer { 668 variant: variant, 669 value: value, 670 err: PhantomData, 671 }) 672 } 673 674 forward_to_deserialize! { 675 bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit seq 676 seq_fixed_size bytes byte_buf map unit_struct tuple_struct struct 677 struct_field tuple ignored_any 678 } 679 } 680 681 impl<E> ContentDeserializer<E> { 682 /// private API, don't use new(content: Content) -> Self683 pub fn new(content: Content) -> Self { 684 ContentDeserializer { 685 content: content, 686 err: PhantomData, 687 } 688 } 689 } 690 691 struct EnumDeserializer<E> 692 where E: de::Error 693 { 694 variant: Content, 695 value: Option<Content>, 696 err: PhantomData<E>, 697 } 698 699 impl<E> de::EnumVisitor for EnumDeserializer<E> 700 where E: de::Error 701 { 702 type Error = E; 703 type Variant = VariantDeserializer<Self::Error>; 704 visit_variant_seed<V>(self, seed: V) -> Result<(V::Value, VariantDeserializer<E>), Self::Error> where V: de::DeserializeSeed705 fn visit_variant_seed<V>(self, 706 seed: V) 707 -> Result<(V::Value, VariantDeserializer<E>), Self::Error> 708 where V: de::DeserializeSeed 709 { 710 let visitor = VariantDeserializer { 711 value: self.value, 712 err: PhantomData, 713 }; 714 seed.deserialize(ContentDeserializer::new(self.variant)).map(|v| (v, visitor)) 715 } 716 } 717 718 struct VariantDeserializer<E> 719 where E: de::Error 720 { 721 value: Option<Content>, 722 err: PhantomData<E>, 723 } 724 725 impl<E> de::VariantVisitor for VariantDeserializer<E> 726 where E: de::Error 727 { 728 type Error = E; 729 visit_unit(self) -> Result<(), E>730 fn visit_unit(self) -> Result<(), E> { 731 match self.value { 732 Some(value) => de::Deserialize::deserialize(ContentDeserializer::new(value)), 733 None => Ok(()), 734 } 735 } 736 visit_newtype_seed<T>(self, seed: T) -> Result<T::Value, E> where T: de::DeserializeSeed737 fn visit_newtype_seed<T>(self, seed: T) -> Result<T::Value, E> 738 where T: de::DeserializeSeed 739 { 740 match self.value { 741 Some(value) => seed.deserialize(ContentDeserializer::new(value)), 742 None => Err(de::Error::invalid_type(de::Unexpected::UnitVariant, &"newtype variant")), 743 } 744 } 745 visit_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor746 fn visit_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error> 747 where V: de::Visitor 748 { 749 match self.value { 750 Some(Content::Seq(v)) => { 751 de::Deserializer::deserialize(SeqDeserializer::new(v), visitor) 752 } 753 Some(other) => Err(de::Error::invalid_type(other.unexpected(), &"tuple variant")), 754 None => Err(de::Error::invalid_type(de::Unexpected::UnitVariant, &"tuple variant")), 755 } 756 } 757 visit_struct<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor758 fn visit_struct<V>(self, 759 _fields: &'static [&'static str], 760 visitor: V) 761 -> Result<V::Value, Self::Error> 762 where V: de::Visitor 763 { 764 match self.value { 765 Some(Content::Map(v)) => { 766 de::Deserializer::deserialize(MapDeserializer::new(v), visitor) 767 } 768 Some(other) => Err(de::Error::invalid_type(other.unexpected(), &"struct variant")), 769 _ => Err(de::Error::invalid_type(de::Unexpected::UnitVariant, &"struct variant")), 770 } 771 } 772 } 773 774 struct SeqDeserializer<E> 775 where E: de::Error 776 { 777 iter: <Vec<Content> as IntoIterator>::IntoIter, 778 err: PhantomData<E>, 779 } 780 781 impl<E> SeqDeserializer<E> 782 where E: de::Error 783 { new(vec: Vec<Content>) -> Self784 fn new(vec: Vec<Content>) -> Self { 785 SeqDeserializer { 786 iter: vec.into_iter(), 787 err: PhantomData, 788 } 789 } 790 } 791 792 impl<E> de::Deserializer for SeqDeserializer<E> 793 where E: de::Error 794 { 795 type Error = E; 796 797 #[inline] deserialize<V>(mut self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor798 fn deserialize<V>(mut self, visitor: V) -> Result<V::Value, Self::Error> 799 where V: de::Visitor 800 { 801 let len = self.iter.len(); 802 if len == 0 { 803 visitor.visit_unit() 804 } else { 805 let ret = try!(visitor.visit_seq(&mut self)); 806 let remaining = self.iter.len(); 807 if remaining == 0 { 808 Ok(ret) 809 } else { 810 Err(de::Error::invalid_length(len, &"fewer elements in array")) 811 } 812 } 813 } 814 815 forward_to_deserialize! { 816 bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option 817 seq seq_fixed_size bytes byte_buf map unit_struct newtype_struct 818 tuple_struct struct struct_field tuple enum ignored_any 819 } 820 } 821 822 impl<E> de::SeqVisitor for SeqDeserializer<E> 823 where E: de::Error 824 { 825 type Error = E; 826 visit_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> where T: de::DeserializeSeed827 fn visit_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> 828 where T: de::DeserializeSeed 829 { 830 match self.iter.next() { 831 Some(value) => seed.deserialize(ContentDeserializer::new(value)).map(Some), 832 None => Ok(None), 833 } 834 } 835 size_hint(&self) -> (usize, Option<usize>)836 fn size_hint(&self) -> (usize, Option<usize>) { 837 self.iter.size_hint() 838 } 839 } 840 841 struct MapDeserializer<E> 842 where E: de::Error 843 { 844 iter: <Vec<(Content, Content)> as IntoIterator>::IntoIter, 845 value: Option<Content>, 846 err: PhantomData<E>, 847 } 848 849 impl<E> MapDeserializer<E> 850 where E: de::Error 851 { new(map: Vec<(Content, Content)>) -> Self852 fn new(map: Vec<(Content, Content)>) -> Self { 853 MapDeserializer { 854 iter: map.into_iter(), 855 value: None, 856 err: PhantomData, 857 } 858 } 859 } 860 861 impl<E> de::MapVisitor for MapDeserializer<E> 862 where E: de::Error 863 { 864 type Error = E; 865 visit_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> where T: de::DeserializeSeed866 fn visit_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> 867 where T: de::DeserializeSeed 868 { 869 match self.iter.next() { 870 Some((key, value)) => { 871 self.value = Some(value); 872 seed.deserialize(ContentDeserializer::new(key)).map(Some) 873 } 874 None => Ok(None), 875 } 876 } 877 visit_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error> where T: de::DeserializeSeed878 fn visit_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error> 879 where T: de::DeserializeSeed 880 { 881 match self.value.take() { 882 Some(value) => seed.deserialize(ContentDeserializer::new(value)), 883 None => Err(de::Error::custom("value is missing")), 884 } 885 } 886 size_hint(&self) -> (usize, Option<usize>)887 fn size_hint(&self) -> (usize, Option<usize>) { 888 self.iter.size_hint() 889 } 890 } 891 892 impl<E> de::Deserializer for MapDeserializer<E> 893 where E: de::Error 894 { 895 type Error = E; 896 897 #[inline] deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor898 fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error> 899 where V: de::Visitor 900 { 901 visitor.visit_map(self) 902 } 903 904 forward_to_deserialize! { 905 bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option 906 seq seq_fixed_size bytes byte_buf map unit_struct newtype_struct 907 tuple_struct struct struct_field tuple enum ignored_any 908 } 909 } 910 911 912 /// Not public API. 913 pub struct ContentRefDeserializer<'a, E> { 914 content: &'a Content, 915 err: PhantomData<E>, 916 } 917 918 /// Used when deserializing an untagged enum because the content may need to be 919 /// used more than once. 920 impl<'a, E> Deserializer for ContentRefDeserializer<'a, E> 921 where E: de::Error 922 { 923 type Error = E; 924 deserialize<V>(self, visitor: V) -> Result<V::Value, E> where V: Visitor925 fn deserialize<V>(self, visitor: V) -> Result<V::Value, E> 926 where V: Visitor 927 { 928 match *self.content { 929 Content::Bool(v) => visitor.visit_bool(v), 930 Content::U8(v) => visitor.visit_u8(v), 931 Content::U16(v) => visitor.visit_u16(v), 932 Content::U32(v) => visitor.visit_u32(v), 933 Content::U64(v) => visitor.visit_u64(v), 934 Content::I8(v) => visitor.visit_i8(v), 935 Content::I16(v) => visitor.visit_i16(v), 936 Content::I32(v) => visitor.visit_i32(v), 937 Content::I64(v) => visitor.visit_i64(v), 938 Content::F32(v) => visitor.visit_f32(v), 939 Content::F64(v) => visitor.visit_f64(v), 940 Content::Char(v) => visitor.visit_char(v), 941 Content::String(ref v) => visitor.visit_str(v), 942 Content::Unit => visitor.visit_unit(), 943 Content::None => visitor.visit_none(), 944 Content::Some(ref v) => visitor.visit_some(ContentRefDeserializer::new(v)), 945 Content::Newtype(ref v) => visitor.visit_newtype_struct(ContentRefDeserializer::new(v)), 946 Content::Seq(ref v) => { 947 let seq = v.into_iter().map(ContentRefDeserializer::new); 948 let mut seq_visitor = de::value::SeqDeserializer::new(seq); 949 let value = try!(visitor.visit_seq(&mut seq_visitor)); 950 try!(seq_visitor.end()); 951 Ok(value) 952 } 953 Content::Map(ref v) => { 954 let map = v.into_iter().map(|&(ref k, ref v)| { 955 (ContentRefDeserializer::new(k), 956 ContentRefDeserializer::new(v)) 957 }); 958 let mut map_visitor = de::value::MapDeserializer::new(map); 959 let value = try!(visitor.visit_map(&mut map_visitor)); 960 try!(map_visitor.end()); 961 Ok(value) 962 } 963 Content::Bytes(ref v) => visitor.visit_bytes(v), 964 } 965 } 966 deserialize_option<V>(self, visitor: V) -> Result<V::Value, E> where V: Visitor967 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, E> 968 where V: Visitor 969 { 970 match *self.content { 971 Content::None => visitor.visit_none(), 972 Content::Some(ref v) => visitor.visit_some(ContentRefDeserializer::new(v)), 973 Content::Unit => visitor.visit_unit(), 974 _ => visitor.visit_some(self), 975 } 976 } 977 deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value, E> where V: Visitor978 fn deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value, E> 979 where V: Visitor 980 { 981 visitor.visit_newtype_struct(self) 982 } 983 deserialize_enum<V>(self, _name: &str, _variants: &'static [&'static str], visitor: V) -> Result<V::Value, Self::Error> where V: Visitor984 fn deserialize_enum<V>(self, 985 _name: &str, 986 _variants: &'static [&'static str], 987 visitor: V) 988 -> Result<V::Value, Self::Error> 989 where V: Visitor 990 { 991 let (variant, value) = match *self.content { 992 Content::Map(ref value) => { 993 let mut iter = value.into_iter(); 994 let &(ref variant, ref value) = match iter.next() { 995 Some(v) => v, 996 None => { 997 return Err(de::Error::invalid_value(de::Unexpected::Map, 998 &"map with a single key")); 999 } 1000 }; 1001 // enums are encoded in json as maps with a single key:value pair 1002 if iter.next().is_some() { 1003 return Err(de::Error::invalid_value(de::Unexpected::Map, 1004 &"map with a single key")); 1005 } 1006 (variant, Some(value)) 1007 } 1008 ref s @ Content::String(_) => (s, None), 1009 ref other => { 1010 return Err(de::Error::invalid_type(other.unexpected(), &"string or map")); 1011 } 1012 }; 1013 1014 visitor.visit_enum(EnumRefDeserializer { 1015 variant: variant, 1016 value: value, 1017 err: PhantomData, 1018 }) 1019 } 1020 1021 forward_to_deserialize! { 1022 bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit seq 1023 seq_fixed_size bytes byte_buf map unit_struct tuple_struct struct 1024 struct_field tuple ignored_any 1025 } 1026 } 1027 1028 impl<'a, E> ContentRefDeserializer<'a, E> { 1029 /// private API, don't use new(content: &'a Content) -> Self1030 pub fn new(content: &'a Content) -> Self { 1031 ContentRefDeserializer { 1032 content: content, 1033 err: PhantomData, 1034 } 1035 } 1036 } 1037 1038 struct EnumRefDeserializer<'a, E> 1039 where E: de::Error 1040 { 1041 variant: &'a Content, 1042 value: Option<&'a Content>, 1043 err: PhantomData<E>, 1044 } 1045 1046 impl<'a, E> de::EnumVisitor for EnumRefDeserializer<'a, E> 1047 where E: de::Error 1048 { 1049 type Error = E; 1050 type Variant = VariantRefDeserializer<'a, Self::Error>; 1051 visit_variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error> where V: de::DeserializeSeed1052 fn visit_variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error> 1053 where V: de::DeserializeSeed 1054 { 1055 let visitor = VariantRefDeserializer { 1056 value: self.value, 1057 err: PhantomData, 1058 }; 1059 seed.deserialize(ContentRefDeserializer::new(self.variant)).map(|v| (v, visitor)) 1060 } 1061 } 1062 1063 struct VariantRefDeserializer<'a, E> 1064 where E: de::Error 1065 { 1066 value: Option<&'a Content>, 1067 err: PhantomData<E>, 1068 } 1069 1070 impl<'a, E> de::VariantVisitor for VariantRefDeserializer<'a, E> 1071 where E: de::Error 1072 { 1073 type Error = E; 1074 visit_unit(self) -> Result<(), E>1075 fn visit_unit(self) -> Result<(), E> { 1076 match self.value { 1077 Some(value) => de::Deserialize::deserialize(ContentRefDeserializer::new(value)), 1078 None => Ok(()), 1079 } 1080 } 1081 visit_newtype_seed<T>(self, seed: T) -> Result<T::Value, E> where T: de::DeserializeSeed1082 fn visit_newtype_seed<T>(self, seed: T) -> Result<T::Value, E> 1083 where T: de::DeserializeSeed 1084 { 1085 match self.value { 1086 Some(value) => seed.deserialize(ContentRefDeserializer::new(value)), 1087 None => Err(de::Error::invalid_type(de::Unexpected::UnitVariant, &"newtype variant")), 1088 } 1089 } 1090 visit_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor1091 fn visit_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error> 1092 where V: de::Visitor 1093 { 1094 match self.value { 1095 Some(&Content::Seq(ref v)) => { 1096 de::Deserializer::deserialize(SeqRefDeserializer::new(v), visitor) 1097 } 1098 Some(other) => Err(de::Error::invalid_type(other.unexpected(), &"tuple variant")), 1099 None => Err(de::Error::invalid_type(de::Unexpected::UnitVariant, &"tuple variant")), 1100 } 1101 } 1102 visit_struct<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor1103 fn visit_struct<V>(self, 1104 _fields: &'static [&'static str], 1105 visitor: V) 1106 -> Result<V::Value, Self::Error> 1107 where V: de::Visitor 1108 { 1109 match self.value { 1110 Some(&Content::Map(ref v)) => { 1111 de::Deserializer::deserialize(MapRefDeserializer::new(v), visitor) 1112 } 1113 Some(other) => Err(de::Error::invalid_type(other.unexpected(), &"struct variant")), 1114 _ => Err(de::Error::invalid_type(de::Unexpected::UnitVariant, &"struct variant")), 1115 } 1116 } 1117 } 1118 1119 struct SeqRefDeserializer<'a, E> 1120 where E: de::Error 1121 { 1122 iter: <&'a [Content] as IntoIterator>::IntoIter, 1123 err: PhantomData<E>, 1124 } 1125 1126 impl<'a, E> SeqRefDeserializer<'a, E> 1127 where E: de::Error 1128 { new(vec: &'a [Content]) -> Self1129 fn new(vec: &'a [Content]) -> Self { 1130 SeqRefDeserializer { 1131 iter: vec.into_iter(), 1132 err: PhantomData, 1133 } 1134 } 1135 } 1136 1137 impl<'a, E> de::Deserializer for SeqRefDeserializer<'a, E> 1138 where E: de::Error 1139 { 1140 type Error = E; 1141 1142 #[inline] deserialize<V>(mut self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor1143 fn deserialize<V>(mut self, visitor: V) -> Result<V::Value, Self::Error> 1144 where V: de::Visitor 1145 { 1146 let len = self.iter.len(); 1147 if len == 0 { 1148 visitor.visit_unit() 1149 } else { 1150 let ret = try!(visitor.visit_seq(&mut self)); 1151 let remaining = self.iter.len(); 1152 if remaining == 0 { 1153 Ok(ret) 1154 } else { 1155 Err(de::Error::invalid_length(len, &"fewer elements in array")) 1156 } 1157 } 1158 } 1159 1160 forward_to_deserialize! { 1161 bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option 1162 seq seq_fixed_size bytes byte_buf map unit_struct newtype_struct 1163 tuple_struct struct struct_field tuple enum ignored_any 1164 } 1165 } 1166 1167 impl<'a, E> de::SeqVisitor for SeqRefDeserializer<'a, E> 1168 where E: de::Error 1169 { 1170 type Error = E; 1171 visit_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> where T: de::DeserializeSeed1172 fn visit_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> 1173 where T: de::DeserializeSeed 1174 { 1175 match self.iter.next() { 1176 Some(value) => seed.deserialize(ContentRefDeserializer::new(value)).map(Some), 1177 None => Ok(None), 1178 } 1179 } 1180 size_hint(&self) -> (usize, Option<usize>)1181 fn size_hint(&self) -> (usize, Option<usize>) { 1182 self.iter.size_hint() 1183 } 1184 } 1185 1186 struct MapRefDeserializer<'a, E> 1187 where E: de::Error 1188 { 1189 iter: <&'a [(Content, Content)] as IntoIterator>::IntoIter, 1190 value: Option<&'a Content>, 1191 err: PhantomData<E>, 1192 } 1193 1194 impl<'a, E> MapRefDeserializer<'a, E> 1195 where E: de::Error 1196 { new(map: &'a [(Content, Content)]) -> Self1197 fn new(map: &'a [(Content, Content)]) -> Self { 1198 MapRefDeserializer { 1199 iter: map.into_iter(), 1200 value: None, 1201 err: PhantomData, 1202 } 1203 } 1204 } 1205 1206 impl<'a, E> de::MapVisitor for MapRefDeserializer<'a, E> 1207 where E: de::Error 1208 { 1209 type Error = E; 1210 visit_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> where T: de::DeserializeSeed1211 fn visit_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> 1212 where T: de::DeserializeSeed 1213 { 1214 match self.iter.next() { 1215 Some(&(ref key, ref value)) => { 1216 self.value = Some(value); 1217 seed.deserialize(ContentRefDeserializer::new(key)).map(Some) 1218 } 1219 None => Ok(None), 1220 } 1221 } 1222 visit_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error> where T: de::DeserializeSeed1223 fn visit_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error> 1224 where T: de::DeserializeSeed 1225 { 1226 match self.value.take() { 1227 Some(value) => seed.deserialize(ContentRefDeserializer::new(value)), 1228 None => Err(de::Error::custom("value is missing")), 1229 } 1230 } 1231 size_hint(&self) -> (usize, Option<usize>)1232 fn size_hint(&self) -> (usize, Option<usize>) { 1233 self.iter.size_hint() 1234 } 1235 } 1236 1237 impl<'a, E> de::Deserializer for MapRefDeserializer<'a, E> 1238 where E: de::Error 1239 { 1240 type Error = E; 1241 1242 #[inline] deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor1243 fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error> 1244 where V: de::Visitor 1245 { 1246 visitor.visit_map(self) 1247 } 1248 1249 forward_to_deserialize! { 1250 bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option 1251 seq seq_fixed_size bytes byte_buf map unit_struct newtype_struct 1252 tuple_struct struct struct_field tuple enum ignored_any 1253 } 1254 } 1255 1256 impl<E> de::value::ValueDeserializer<E> for ContentDeserializer<E> 1257 where E: de::Error 1258 { 1259 type Deserializer = Self; 1260 into_deserializer(self) -> Self1261 fn into_deserializer(self) -> Self { 1262 self 1263 } 1264 } 1265 1266 impl<'a, E> de::value::ValueDeserializer<E> for ContentRefDeserializer<'a, E> 1267 where E: de::Error 1268 { 1269 type Deserializer = Self; 1270 into_deserializer(self) -> Self1271 fn into_deserializer(self) -> Self { 1272 self 1273 } 1274 } 1275 1276 /// Visitor for deserializing an internally tagged unit variant. 1277 /// 1278 /// Not public API. 1279 pub struct InternallyTaggedUnitVisitor<'a> { 1280 type_name: &'a str, 1281 variant_name: &'a str, 1282 } 1283 1284 impl<'a> InternallyTaggedUnitVisitor<'a> { 1285 /// Not public API. new(type_name: &'a str, variant_name: &'a str) -> Self1286 pub fn new(type_name: &'a str, variant_name: &'a str) -> Self { 1287 InternallyTaggedUnitVisitor { 1288 type_name: type_name, 1289 variant_name: variant_name, 1290 } 1291 } 1292 } 1293 1294 impl<'a> Visitor for InternallyTaggedUnitVisitor<'a> { 1295 type Value = (); 1296 expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result1297 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 1298 write!(formatter, "unit variant {}::{}", self.type_name, self.variant_name) 1299 } 1300 visit_map<V>(self, _: V) -> Result<(), V::Error> where V: MapVisitor1301 fn visit_map<V>(self, _: V) -> Result<(), V::Error> 1302 where V: MapVisitor 1303 { 1304 Ok(()) 1305 } 1306 } 1307 1308 /// Visitor for deserializing an untagged unit variant. 1309 /// 1310 /// Not public API. 1311 pub struct UntaggedUnitVisitor<'a> { 1312 type_name: &'a str, 1313 variant_name: &'a str, 1314 } 1315 1316 impl<'a> UntaggedUnitVisitor<'a> { 1317 /// Not public API. new(type_name: &'a str, variant_name: &'a str) -> Self1318 pub fn new(type_name: &'a str, variant_name: &'a str) -> Self { 1319 UntaggedUnitVisitor { 1320 type_name: type_name, 1321 variant_name: variant_name, 1322 } 1323 } 1324 } 1325 1326 impl<'a> Visitor for UntaggedUnitVisitor<'a> { 1327 type Value = (); 1328 expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result1329 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 1330 write!(formatter, "unit variant {}::{}", self.type_name, self.variant_name) 1331 } 1332 visit_unit<E>(self) -> Result<(), E> where E: de::Error1333 fn visit_unit<E>(self) -> Result<(), E> 1334 where E: de::Error 1335 { 1336 Ok(()) 1337 } 1338 } 1339