]> git.proxmox.com Git - rustc.git/blob - src/vendor/serde/src/de/private.rs
New upstream version 1.17.0+dfsg1
[rustc.git] / src / vendor / serde / src / de / private.rs
1 use core::marker::PhantomData;
2
3 use de::{Deserialize, Deserializer, Error, Visitor};
4
5 #[cfg(any(feature = "std", feature = "collections"))]
6 pub use de::content::{Content, ContentRefDeserializer, ContentDeserializer, TaggedContentVisitor,
7 TagOrContentField, TagOrContentFieldVisitor, InternallyTaggedUnitVisitor,
8 UntaggedUnitVisitor};
9
10 /// If the missing field is of type `Option<T>` then treat is as `None`,
11 /// otherwise it is an error.
12 pub fn missing_field<V, E>(field: &'static str) -> Result<V, E>
13 where V: Deserialize,
14 E: Error
15 {
16 struct MissingFieldDeserializer<E>(&'static str, PhantomData<E>);
17
18 impl<E> Deserializer for MissingFieldDeserializer<E>
19 where E: Error
20 {
21 type Error = E;
22
23 fn deserialize<V>(self, _visitor: V) -> Result<V::Value, E>
24 where V: Visitor
25 {
26 Err(Error::missing_field(self.0))
27 }
28
29 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, E>
30 where V: Visitor
31 {
32 visitor.visit_none()
33 }
34
35 forward_to_deserialize! {
36 bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit seq
37 seq_fixed_size bytes byte_buf map unit_struct newtype_struct
38 tuple_struct struct struct_field tuple enum ignored_any
39 }
40 }
41
42 let deserializer = MissingFieldDeserializer(field, PhantomData);
43 Deserialize::deserialize(deserializer)
44 }