Skip to content

Commit bc310fa

Browse files
committed
fix variants
1 parent 451646c commit bc310fa

File tree

1 file changed

+63
-46
lines changed

1 file changed

+63
-46
lines changed

src/de.rs

Lines changed: 63 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -5,46 +5,12 @@ use error::{Error, Result};
55

66
pub struct BencodeAccess<'a, R: 'a + Read> {
77
de: &'a mut Deserializer<R>,
8+
len: Option<usize>,
89
}
910

1011
impl<'a, R: 'a + Read> BencodeAccess<'a, R> {
11-
fn new(de: &'a mut Deserializer<R>) -> BencodeAccess<'a, R> {
12-
BencodeAccess { de: de }
13-
}
14-
}
15-
16-
impl<'de, 'a, R: 'a + Read> de::VariantAccess<'de> for BencodeAccess<'a, R> {
17-
type Error = Error;
18-
19-
fn unit_variant(self) -> Result<()> {
20-
Ok(())
21-
}
22-
23-
fn newtype_variant_seed<T: de::DeserializeSeed<'de>>(self, seed: T) -> Result<T::Value> {
24-
let res = seed.deserialize(&mut *self.de)?;
25-
if ParseResult::End != self.de.parse()? {
26-
return Err(Error::InvalidType("expected `d`".to_string()));
27-
}
28-
Ok(res)
29-
}
30-
31-
fn tuple_variant<V: de::Visitor<'de>>(self, _: usize, visitor: V) -> Result<V::Value> {
32-
let res = de::Deserializer::deserialize_any(&mut *self.de, visitor)?;
33-
if ParseResult::End != self.de.parse()? {
34-
return Err(Error::InvalidType("expected `d`".to_string()));
35-
}
36-
Ok(res)
37-
}
38-
39-
fn struct_variant<V: de::Visitor<'de>>(self,
40-
_: &'static [&'static str],
41-
visitor: V)
42-
-> Result<V::Value> {
43-
let res = de::Deserializer::deserialize_any(&mut *self.de, visitor)?;
44-
if ParseResult::End != self.de.parse()? {
45-
return Err(Error::InvalidType("expected `d`".to_string()));
46-
}
47-
Ok(res)
12+
fn new(de: &'a mut Deserializer<R>, len: Option<usize>) -> BencodeAccess<'a, R> {
13+
BencodeAccess { de: de, len: len }
4814
}
4915
}
5016

@@ -54,13 +20,24 @@ impl<'de, 'a, R: 'a + Read> de::SeqAccess<'de> for BencodeAccess<'a, R> {
5420
fn next_element_seed<T: de::DeserializeSeed<'de>>(&mut self,
5521
seed: T)
5622
-> Result<Option<T::Value>> {
57-
match self.de.parse()? {
23+
let res = match self.de.parse()? {
5824
ParseResult::End => Ok(None),
5925
r @ _ => {
6026
self.de.next = Some(r);
6127
Ok(Some(seed.deserialize(&mut *self.de)?))
6228
}
29+
};
30+
match self.len {
31+
Some(l) => {
32+
let l = l - 1;
33+
self.len = Some(l);
34+
if l == 0 && ParseResult::End != self.de.parse()? {
35+
return Err(Error::InvalidType("expected `e`".to_string()));
36+
}
37+
}
38+
None => (),
6339
}
40+
res
6441
}
6542
}
6643

@@ -85,6 +62,47 @@ impl<'de, 'a, R: 'a + Read> de::MapAccess<'de> for BencodeAccess<'a, R> {
8562
}
8663
}
8764

65+
impl<'de, 'a, R: 'a + Read> de::VariantAccess<'de> for BencodeAccess<'a, R> {
66+
type Error = Error;
67+
68+
fn unit_variant(self) -> Result<()> {
69+
Ok(())
70+
}
71+
72+
fn newtype_variant_seed<T: de::DeserializeSeed<'de>>(self, seed: T) -> Result<T::Value> {
73+
let res = seed.deserialize(&mut *self.de)?;
74+
if ParseResult::End != self.de.parse()? {
75+
return Err(Error::InvalidType("expected `e`".to_string()));
76+
}
77+
Ok(res)
78+
}
79+
80+
fn tuple_variant<V: de::Visitor<'de>>(self, len: usize, visitor: V) -> Result<V::Value> {
81+
let res = match self.de.parse()? {
82+
ParseResult::List => {
83+
visitor
84+
.visit_seq(BencodeAccess::new(&mut *self.de, Some(len)))?
85+
}
86+
_ => return Err(Error::InvalidType("expected list".to_string())),
87+
};
88+
if ParseResult::End != self.de.parse()? {
89+
return Err(Error::InvalidType("expected `e`".to_string()));
90+
}
91+
Ok(res)
92+
}
93+
94+
fn struct_variant<V: de::Visitor<'de>>(self,
95+
_: &'static [&'static str],
96+
visitor: V)
97+
-> Result<V::Value> {
98+
let res = de::Deserializer::deserialize_any(&mut *self.de, visitor)?;
99+
if ParseResult::End != self.de.parse()? {
100+
return Err(Error::InvalidType("expected `e`".to_string()));
101+
}
102+
Ok(res)
103+
}
104+
}
105+
88106
impl<'de, 'a, R: 'a + Read> de::EnumAccess<'de> for BencodeAccess<'a, R> {
89107
type Error = Error;
90108
type Variant = Self;
@@ -192,6 +210,9 @@ impl<'de, R: Read> Deserializer<R> {
192210
}
193211

194212
fn parse(&mut self) -> Result<ParseResult> {
213+
if let Some(t) = self.next.take() {
214+
return Ok(t);
215+
}
195216
let mut buf = [0; 1];
196217
if 1 != self.reader.read(&mut buf).map_err(Error::IoError)? {
197218
return Err(Error::EndOfStream);
@@ -212,15 +233,11 @@ impl<'de, 'a, R: Read> de::Deserializer<'de> for &'a mut Deserializer<R> {
212233

213234
#[inline]
214235
fn deserialize_any<V: de::Visitor<'de>>(mut self, visitor: V) -> Result<V::Value> {
215-
let parser_res = match self.next.take() {
216-
Some(v) => v,
217-
None => self.parse()?,
218-
};
219-
match parser_res {
236+
match self.parse()? {
220237
ParseResult::Int(i) => visitor.visit_i64(i),
221238
ParseResult::Bytes(s) => visitor.visit_bytes(s.as_ref()),
222-
ParseResult::List => visitor.visit_seq(BencodeAccess::new(&mut self)),
223-
ParseResult::Map => visitor.visit_map(BencodeAccess::new(&mut self)),
239+
ParseResult::List => visitor.visit_seq(BencodeAccess::new(&mut self, None)),
240+
ParseResult::Map => visitor.visit_map(BencodeAccess::new(&mut self, None)),
224241
ParseResult::End => Err(Error::EndOfStream),
225242
}
226243
}
@@ -244,7 +261,7 @@ impl<'de, 'a, R: Read> de::Deserializer<'de> for &'a mut Deserializer<R> {
244261
-> Result<V::Value>
245262
where V: de::Visitor<'de>
246263
{
247-
visitor.visit_enum(BencodeAccess::new(self))
264+
visitor.visit_enum(BencodeAccess::new(self, None))
248265
}
249266
}
250267

0 commit comments

Comments
 (0)