serde_name/
de_adapter.rs

1// Copyright (c) Facebook, Inc. and its affiliates
2// SPDX-License-Identifier: MIT OR Apache-2.0
3
4use serde::de::Visitor;
5
6/// An adapter for `serde::de::Deserializer` implementations that lets you override the
7/// name of the top-level container.
8pub struct DeserializeNameAdapter<D> {
9    inner: D,
10    name: &'static str,
11}
12
13impl<D> DeserializeNameAdapter<D> {
14    pub fn new(inner: D, name: &'static str) -> Self {
15        Self { inner, name }
16    }
17}
18
19macro_rules! declare_deserialize {
20    ($method:ident) => {
21        fn $method<V>(self, visitor: V) -> std::result::Result<V::Value, Self::Error>
22        where
23            V: Visitor<'de>,
24        {
25            self.inner.$method(visitor)
26        }
27    };
28}
29
30impl<'de, D> serde::de::Deserializer<'de> for DeserializeNameAdapter<D>
31where
32    D: serde::de::Deserializer<'de>,
33{
34    type Error = D::Error;
35
36    declare_deserialize!(deserialize_any);
37    declare_deserialize!(deserialize_identifier);
38    declare_deserialize!(deserialize_ignored_any);
39    declare_deserialize!(deserialize_bool);
40    declare_deserialize!(deserialize_i8);
41    declare_deserialize!(deserialize_i16);
42    declare_deserialize!(deserialize_i32);
43    declare_deserialize!(deserialize_i64);
44    declare_deserialize!(deserialize_i128);
45    declare_deserialize!(deserialize_u8);
46    declare_deserialize!(deserialize_u16);
47    declare_deserialize!(deserialize_u32);
48    declare_deserialize!(deserialize_u64);
49    declare_deserialize!(deserialize_u128);
50    declare_deserialize!(deserialize_f32);
51    declare_deserialize!(deserialize_f64);
52    declare_deserialize!(deserialize_char);
53    declare_deserialize!(deserialize_str);
54    declare_deserialize!(deserialize_string);
55    declare_deserialize!(deserialize_bytes);
56    declare_deserialize!(deserialize_byte_buf);
57    declare_deserialize!(deserialize_option);
58    declare_deserialize!(deserialize_unit);
59    declare_deserialize!(deserialize_seq);
60    declare_deserialize!(deserialize_map);
61
62    fn deserialize_tuple<V>(
63        self,
64        len: usize,
65        visitor: V,
66    ) -> std::result::Result<V::Value, Self::Error>
67    where
68        V: Visitor<'de>,
69    {
70        self.inner.deserialize_tuple(len, visitor)
71    }
72
73    fn deserialize_unit_struct<V>(
74        self,
75        _name: &'static str,
76        visitor: V,
77    ) -> std::result::Result<V::Value, Self::Error>
78    where
79        V: Visitor<'de>,
80    {
81        self.inner.deserialize_unit_struct(self.name, visitor)
82    }
83
84    fn deserialize_newtype_struct<V>(
85        self,
86        _name: &'static str,
87        visitor: V,
88    ) -> std::result::Result<V::Value, Self::Error>
89    where
90        V: Visitor<'de>,
91    {
92        self.inner.deserialize_newtype_struct(self.name, visitor)
93    }
94
95    fn deserialize_tuple_struct<V>(
96        self,
97        _name: &'static str,
98        len: usize,
99        visitor: V,
100    ) -> std::result::Result<V::Value, Self::Error>
101    where
102        V: Visitor<'de>,
103    {
104        self.inner.deserialize_tuple_struct(self.name, len, visitor)
105    }
106
107    fn deserialize_struct<V>(
108        self,
109        _name: &'static str,
110        fields: &'static [&'static str],
111        visitor: V,
112    ) -> std::result::Result<V::Value, Self::Error>
113    where
114        V: Visitor<'de>,
115    {
116        self.inner.deserialize_struct(self.name, fields, visitor)
117    }
118
119    fn deserialize_enum<V>(
120        self,
121        _name: &'static str,
122        variants: &'static [&'static str],
123        visitor: V,
124    ) -> std::result::Result<V::Value, Self::Error>
125    where
126        V: Visitor<'de>,
127    {
128        self.inner.deserialize_enum(self.name, variants, visitor)
129    }
130
131    fn is_human_readable(&self) -> bool {
132        self.inner.is_human_readable()
133    }
134}