serde_html_form/de/
part.rs1use std::borrow::Cow;
2
3use serde::{
4 de::{self, Error as _, IntoDeserializer},
5 forward_to_deserialize_any,
6};
7
8use super::Error;
9
10#[derive(PartialEq, PartialOrd, Eq, Ord, Hash)]
11pub(super) struct Part<'de>(pub Cow<'de, str>);
12
13impl<'de> IntoDeserializer<'de> for Part<'de> {
14 type Deserializer = Self;
15
16 fn into_deserializer(self) -> Self::Deserializer {
17 self
18 }
19}
20
21macro_rules! forward_parsed_value {
22 ($($ty:ident => $method:ident,)*) => {
23 $(
24 fn $method<V>(self, visitor: V) -> Result<V::Value, Self::Error>
25 where V: de::Visitor<'de>
26 {
27 match self.0.parse::<$ty>() {
28 Ok(val) => val.into_deserializer().$method(visitor),
29 Err(e) => Err(de::Error::custom(e))
30 }
31 }
32 )*
33 }
34}
35
36impl<'de> de::Deserializer<'de> for Part<'de> {
37 type Error = Error;
38
39 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
40 where
41 V: de::Visitor<'de>,
42 {
43 match self.0 {
44 Cow::Borrowed(value) => visitor.visit_borrowed_str(value),
45 Cow::Owned(value) => visitor.visit_string(value),
46 }
47 }
48
49 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
50 where
51 V: de::Visitor<'de>,
52 {
53 if self.0.is_empty() {
54 visitor.visit_none()
55 } else {
56 visitor.visit_some(self)
57 }
58 }
59
60 fn deserialize_enum<V>(
61 self,
62 _name: &'static str,
63 _variants: &'static [&'static str],
64 visitor: V,
65 ) -> Result<V::Value, Self::Error>
66 where
67 V: de::Visitor<'de>,
68 {
69 visitor.visit_enum(self)
70 }
71
72 fn deserialize_newtype_struct<V>(
73 self,
74 _name: &'static str,
75 visitor: V,
76 ) -> Result<V::Value, Self::Error>
77 where
78 V: de::Visitor<'de>,
79 {
80 visitor.visit_newtype_struct(self)
81 }
82
83 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
84 where
85 V: de::Visitor<'de>,
86 {
87 visitor.visit_seq(PartSeqAccess(Some(self)))
88 }
89
90 forward_to_deserialize_any! {
91 char
92 str
93 string
94 unit
95 bytes
96 byte_buf
97 unit_struct
98 tuple_struct
99 struct
100 identifier
101 tuple
102 ignored_any
103 map
104 }
105
106 forward_parsed_value! {
107 bool => deserialize_bool,
108 u8 => deserialize_u8,
109 u16 => deserialize_u16,
110 u32 => deserialize_u32,
111 u64 => deserialize_u64,
112 i8 => deserialize_i8,
113 i16 => deserialize_i16,
114 i32 => deserialize_i32,
115 i64 => deserialize_i64,
116 f32 => deserialize_f32,
117 f64 => deserialize_f64,
118 }
119}
120
121impl<'de> de::EnumAccess<'de> for Part<'de> {
122 type Error = Error;
123 type Variant = UnitOnlyVariantAccess;
124
125 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
126 where
127 V: de::DeserializeSeed<'de>,
128 {
129 let variant = seed.deserialize(self.0.into_deserializer())?;
130 Ok((variant, UnitOnlyVariantAccess))
131 }
132}
133
134struct PartSeqAccess<'de>(Option<Part<'de>>);
135
136impl<'de> de::SeqAccess<'de> for PartSeqAccess<'de> {
137 type Error = Error;
138
139 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
140 where
141 T: de::DeserializeSeed<'de>,
142 {
143 match self.0.take() {
144 Some(value) => seed.deserialize(value).map(Some),
145 None => Ok(None),
146 }
147 }
148
149 fn size_hint(&self) -> Option<usize> {
150 Some(self.0.is_some() as usize)
151 }
152}
153
154pub(crate) struct UnitOnlyVariantAccess;
155
156impl<'de> de::VariantAccess<'de> for UnitOnlyVariantAccess {
157 type Error = Error;
158
159 fn unit_variant(self) -> Result<(), Self::Error> {
160 Ok(())
161 }
162
163 fn newtype_variant_seed<T>(self, _seed: T) -> Result<T::Value, Self::Error>
164 where
165 T: de::DeserializeSeed<'de>,
166 {
167 Err(Error::custom("expected unit variant"))
168 }
169
170 fn tuple_variant<V>(self, _len: usize, _visitor: V) -> Result<V::Value, Self::Error>
171 where
172 V: de::Visitor<'de>,
173 {
174 Err(Error::custom("expected unit variant"))
175 }
176
177 fn struct_variant<V>(
178 self,
179 _fields: &'static [&'static str],
180 _visitor: V,
181 ) -> Result<V::Value, Self::Error>
182 where
183 V: de::Visitor<'de>,
184 {
185 Err(Error::custom("expected unit variant"))
186 }
187}