@@ -5,46 +5,12 @@ use error::{Error, Result};
55
66pub struct BencodeAccess < ' a , R : ' a + Read > {
77 de : & ' a mut Deserializer < R > ,
8+ len : Option < usize > ,
89}
910
1011impl < ' 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+
88106impl < ' 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