Skip to content

Commit 3a0a7ff

Browse files
bors[bot]cpud36
andcommitted
Merge #166
166: #123: add tests for different enum representations r=torkleyy a=cpud36 This pull request is addressing issue #123. Currently it only adds tests mentioned in the issue. I'm not sure where to put the documentation, so would appreciate some guiding. If anything needs to be changed, please say it. This is my first PR. Co-authored-by: Katasonov Vladyslav <[email protected]> Co-authored-by: cpud36 <[email protected]>
2 parents 690b492 + 64f83ef commit 3a0a7ff

File tree

4 files changed

+540
-8
lines changed

4 files changed

+540
-8
lines changed

src/de/id.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ impl<'a, 'b: 'a, 'c> de::Deserializer<'b> for &'c mut IdDeserializer<'a, 'b> {
2222
self.d.deserialize_identifier(visitor)
2323
}
2424

25+
fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
26+
where
27+
V: Visitor<'b>,
28+
{
29+
self.deserialize_identifier(visitor)
30+
}
31+
2532
fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
2633
where
2734
V: Visitor<'b>,
@@ -113,13 +120,6 @@ impl<'a, 'b: 'a, 'c> de::Deserializer<'b> for &'c mut IdDeserializer<'a, 'b> {
113120
unimplemented!("IdDeserializer may only be used for identifiers")
114121
}
115122

116-
fn deserialize_str<V>(self, _: V) -> Result<V::Value>
117-
where
118-
V: Visitor<'b>,
119-
{
120-
unimplemented!("IdDeserializer may only be used for identifiers")
121-
}
122-
123123
fn deserialize_string<V>(self, _: V) -> Result<V::Value>
124124
where
125125
V: Visitor<'b>,

src/de/mod.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@ use serde::de::{self, DeserializeSeed, Deserializer as SerdeError, Visitor};
66
use std::{borrow::Cow, io, str};
77

88
use self::id::IdDeserializer;
9+
use self::tag::TagDeserializer;
910
use crate::parse::{AnyNum, Bytes, Extensions, ParsedStr};
1011

1112
mod error;
1213
mod id;
14+
mod tag;
1315
#[cfg(test)]
1416
mod tests;
1517
mod value;
@@ -577,7 +579,7 @@ impl<'de, 'a> de::MapAccess<'de> for CommaSeparated<'a, 'de> {
577579
if self.de.bytes.consume(":") {
578580
self.de.bytes.skip_ws()?;
579581

580-
let res = seed.deserialize(&mut *self.de)?;
582+
let res = seed.deserialize(&mut TagDeserializer::new(&mut *self.de))?;
581583

582584
self.had_comma = self.de.bytes.comma()?;
583585

src/de/tag.rs

+230
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
use serde::de::{self, Visitor};
2+
3+
use super::{Deserializer, Error, Result};
4+
5+
pub struct TagDeserializer<'a, 'b: 'a> {
6+
d: &'a mut Deserializer<'b>,
7+
}
8+
9+
impl<'a, 'b: 'a> TagDeserializer<'a, 'b> {
10+
pub fn new(d: &'a mut Deserializer<'b>) -> Self {
11+
TagDeserializer { d }
12+
}
13+
}
14+
15+
impl<'a, 'b: 'a, 'c> de::Deserializer<'b> for &'c mut TagDeserializer<'a, 'b> {
16+
type Error = Error;
17+
18+
fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
19+
where
20+
V: Visitor<'b>,
21+
{
22+
self.d.deserialize_str(visitor)
23+
}
24+
25+
fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
26+
where
27+
V: Visitor<'b>,
28+
{
29+
self.deserialize_str(visitor)
30+
}
31+
32+
fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
33+
where
34+
V: Visitor<'b>,
35+
{
36+
self.d.deserialize_any(visitor)
37+
}
38+
39+
fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
40+
where
41+
V: Visitor<'b>,
42+
{
43+
self.d.deserialize_bool(visitor)
44+
}
45+
46+
fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value>
47+
where
48+
V: Visitor<'b>,
49+
{
50+
self.d.deserialize_i8(visitor)
51+
}
52+
53+
fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value>
54+
where
55+
V: Visitor<'b>,
56+
{
57+
self.d.deserialize_i16(visitor)
58+
}
59+
60+
fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value>
61+
where
62+
V: Visitor<'b>,
63+
{
64+
self.d.deserialize_i32(visitor)
65+
}
66+
67+
fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value>
68+
where
69+
V: Visitor<'b>,
70+
{
71+
self.d.deserialize_i64(visitor)
72+
}
73+
74+
fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value>
75+
where
76+
V: Visitor<'b>,
77+
{
78+
self.d.deserialize_u8(visitor)
79+
}
80+
81+
fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value>
82+
where
83+
V: Visitor<'b>,
84+
{
85+
self.d.deserialize_u16(visitor)
86+
}
87+
88+
fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value>
89+
where
90+
V: Visitor<'b>,
91+
{
92+
self.d.deserialize_u32(visitor)
93+
}
94+
95+
fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value>
96+
where
97+
V: Visitor<'b>,
98+
{
99+
self.d.deserialize_u64(visitor)
100+
}
101+
102+
fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value>
103+
where
104+
V: Visitor<'b>,
105+
{
106+
self.d.deserialize_f32(visitor)
107+
}
108+
109+
fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value>
110+
where
111+
V: Visitor<'b>,
112+
{
113+
self.d.deserialize_f64(visitor)
114+
}
115+
116+
fn deserialize_char<V>(self, visitor: V) -> Result<V::Value>
117+
where
118+
V: Visitor<'b>,
119+
{
120+
self.d.deserialize_char(visitor)
121+
}
122+
123+
fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
124+
where
125+
V: Visitor<'b>,
126+
{
127+
self.d.deserialize_string(visitor)
128+
}
129+
130+
fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
131+
where
132+
V: Visitor<'b>,
133+
{
134+
self.d.deserialize_bytes(visitor)
135+
}
136+
137+
fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
138+
where
139+
V: Visitor<'b>,
140+
{
141+
self.d.deserialize_byte_buf(visitor)
142+
}
143+
144+
fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
145+
where
146+
V: Visitor<'b>,
147+
{
148+
self.d.deserialize_option(visitor)
149+
}
150+
151+
fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
152+
where
153+
V: Visitor<'b>,
154+
{
155+
self.d.deserialize_unit(visitor)
156+
}
157+
158+
fn deserialize_unit_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
159+
where
160+
V: Visitor<'b>,
161+
{
162+
self.d.deserialize_unit_struct(name, visitor)
163+
}
164+
165+
fn deserialize_newtype_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
166+
where
167+
V: Visitor<'b>,
168+
{
169+
self.d.deserialize_newtype_struct(name, visitor)
170+
}
171+
172+
fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
173+
where
174+
V: Visitor<'b>,
175+
{
176+
self.d.deserialize_seq(visitor)
177+
}
178+
179+
fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value>
180+
where
181+
V: Visitor<'b>,
182+
{
183+
self.d.deserialize_tuple(len, visitor)
184+
}
185+
186+
fn deserialize_tuple_struct<V>(self, name: &'static str, len: usize, visitor: V) -> Result<V::Value>
187+
where
188+
V: Visitor<'b>,
189+
{
190+
self.d.deserialize_tuple_struct(name, len, visitor)
191+
}
192+
193+
fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
194+
where
195+
V: Visitor<'b>,
196+
{
197+
self.d.deserialize_map(visitor)
198+
}
199+
200+
fn deserialize_struct<V>(
201+
self,
202+
name: &'static str,
203+
fields: &'static [&'static str],
204+
visitor: V,
205+
) -> Result<V::Value>
206+
where
207+
V: Visitor<'b>,
208+
{
209+
self.d.deserialize_struct(name, fields, visitor)
210+
}
211+
212+
fn deserialize_enum<V>(
213+
self,
214+
name: &'static str,
215+
variants: &'static [&'static str],
216+
visitor: V,
217+
) -> Result<V::Value>
218+
where
219+
V: Visitor<'b>,
220+
{
221+
self.d.deserialize_enum(name, variants, visitor)
222+
}
223+
224+
fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
225+
where
226+
V: Visitor<'b>,
227+
{
228+
self.d.deserialize_ignored_any(visitor)
229+
}
230+
}

0 commit comments

Comments
 (0)