33//! It reads bencoded bytes from the input and writes JSON bytes to the output.
44use std:: io:: { self , Read } ;
55
6- use crate :: rw:: { byte_reader:: ByteReader , writer :: Writer } ;
6+ use crate :: rw:: byte_reader:: ByteReader ;
77
88use super :: {
9- error:: { Error , ReadContext , WriteContext } ,
9+ error:: { Error , ReadContext } ,
1010 BENCODE_END_INTEGER ,
1111} ;
1212
@@ -31,16 +31,13 @@ enum StateExpecting {
3131///
3232/// Will panic if we reach the end of the input without completing the integer
3333/// (without reaching the end of the integer `e`).
34- pub fn parse < R : Read , W : Writer > (
35- reader : & mut ByteReader < R > ,
36- writer : & mut W ,
37- ) -> Result < Vec < u8 > , Error > {
34+ pub fn parse < R : Read > ( reader : & mut ByteReader < R > ) -> Result < Vec < u8 > , Error > {
3835 let mut state = StateExpecting :: Start ;
3936 let mut first_digit_is_zero = false ;
4037 let mut value = vec ! [ ] ;
4138
4239 loop {
43- let byte = next_byte ( reader, writer ) ?;
40+ let byte = next_byte ( reader) ?;
4441
4542 let char = byte as char ;
4643
@@ -51,12 +48,10 @@ pub fn parse<R: Read, W: Writer>(
5148 }
5249 StateExpecting :: DigitOrSign => {
5350 if char == '-' {
54- writer. write_byte ( byte) ?;
5551 value. push ( byte) ;
5652
5753 StateExpecting :: DigitAfterSign
5854 } else if char. is_ascii_digit ( ) {
59- writer. write_byte ( byte) ?;
6055 value. push ( byte) ;
6156
6257 if char == '0' {
@@ -65,23 +60,15 @@ pub fn parse<R: Read, W: Writer>(
6560
6661 StateExpecting :: DigitOrEnd
6762 } else {
68- return Err ( Error :: UnexpectedByteParsingInteger (
69- ReadContext {
70- byte : Some ( byte) ,
71- pos : reader. input_byte_counter ( ) ,
72- latest_bytes : reader. captured_bytes ( ) ,
73- } ,
74- WriteContext {
75- byte : Some ( byte) ,
76- pos : writer. output_byte_counter ( ) ,
77- latest_bytes : writer. captured_bytes ( ) ,
78- } ,
79- ) ) ;
63+ return Err ( Error :: UnexpectedByteParsingInteger ( ReadContext {
64+ byte : Some ( byte) ,
65+ pos : reader. input_byte_counter ( ) ,
66+ latest_bytes : reader. captured_bytes ( ) ,
67+ } ) ) ;
8068 }
8169 }
8270 StateExpecting :: DigitAfterSign => {
8371 if char. is_ascii_digit ( ) {
84- writer. write_byte ( byte) ?;
8572 value. push ( byte) ;
8673
8774 if char == '0' {
@@ -90,56 +77,34 @@ pub fn parse<R: Read, W: Writer>(
9077
9178 StateExpecting :: DigitOrEnd
9279 } else {
93- return Err ( Error :: UnexpectedByteParsingInteger (
94- ReadContext {
95- byte : Some ( byte) ,
96- pos : reader. input_byte_counter ( ) ,
97- latest_bytes : reader. captured_bytes ( ) ,
98- } ,
99- WriteContext {
100- byte : Some ( byte) ,
101- pos : writer. output_byte_counter ( ) ,
102- latest_bytes : writer. captured_bytes ( ) ,
103- } ,
104- ) ) ;
80+ return Err ( Error :: UnexpectedByteParsingInteger ( ReadContext {
81+ byte : Some ( byte) ,
82+ pos : reader. input_byte_counter ( ) ,
83+ latest_bytes : reader. captured_bytes ( ) ,
84+ } ) ) ;
10585 }
10686 }
10787 StateExpecting :: DigitOrEnd => {
10888 if char. is_ascii_digit ( ) {
109- writer. write_byte ( byte) ?;
11089 value. push ( byte) ;
11190
11291 if char == '0' && first_digit_is_zero {
113- return Err ( Error :: LeadingZerosInIntegersNotAllowed (
114- ReadContext {
115- byte : Some ( byte) ,
116- pos : reader. input_byte_counter ( ) ,
117- latest_bytes : reader. captured_bytes ( ) ,
118- } ,
119- WriteContext {
120- byte : Some ( byte) ,
121- pos : writer. output_byte_counter ( ) ,
122- latest_bytes : writer. captured_bytes ( ) ,
123- } ,
124- ) ) ;
92+ return Err ( Error :: LeadingZerosInIntegersNotAllowed ( ReadContext {
93+ byte : Some ( byte) ,
94+ pos : reader. input_byte_counter ( ) ,
95+ latest_bytes : reader. captured_bytes ( ) ,
96+ } ) ) ;
12597 }
12698
12799 StateExpecting :: DigitOrEnd
128100 } else if byte == BENCODE_END_INTEGER {
129101 return Ok ( value) ;
130102 } else {
131- return Err ( Error :: UnexpectedByteParsingInteger (
132- ReadContext {
133- byte : Some ( byte) ,
134- pos : reader. input_byte_counter ( ) ,
135- latest_bytes : reader. captured_bytes ( ) ,
136- } ,
137- WriteContext {
138- byte : Some ( byte) ,
139- pos : writer. output_byte_counter ( ) ,
140- latest_bytes : writer. captured_bytes ( ) ,
141- } ,
142- ) ) ;
103+ return Err ( Error :: UnexpectedByteParsingInteger ( ReadContext {
104+ byte : Some ( byte) ,
105+ pos : reader. input_byte_counter ( ) ,
106+ latest_bytes : reader. captured_bytes ( ) ,
107+ } ) ) ;
143108 }
144109 }
145110 } ;
@@ -151,23 +116,16 @@ pub fn parse<R: Read, W: Writer>(
151116/// # Errors
152117///
153118/// Will return an error if the end of input was reached.
154- fn next_byte < R : Read , W : Writer > ( reader : & mut ByteReader < R > , writer : & W ) -> Result < u8 , Error > {
119+ fn next_byte < R : Read > ( reader : & mut ByteReader < R > ) -> Result < u8 , Error > {
155120 match reader. read_byte ( ) {
156121 Ok ( byte) => Ok ( byte) ,
157122 Err ( err) => {
158123 if err. kind ( ) == io:: ErrorKind :: UnexpectedEof {
159- return Err ( Error :: UnexpectedEndOfInputParsingInteger (
160- ReadContext {
161- byte : None ,
162- pos : reader. input_byte_counter ( ) ,
163- latest_bytes : reader. captured_bytes ( ) ,
164- } ,
165- WriteContext {
166- byte : None ,
167- pos : writer. output_byte_counter ( ) ,
168- latest_bytes : writer. captured_bytes ( ) ,
169- } ,
170- ) ) ;
124+ return Err ( Error :: UnexpectedEndOfInputParsingInteger ( ReadContext {
125+ byte : None ,
126+ pos : reader. input_byte_counter ( ) ,
127+ latest_bytes : reader. captured_bytes ( ) ,
128+ } ) ) ;
171129 }
172130 Err ( err. into ( ) )
173131 }
@@ -248,7 +206,7 @@ mod tests {
248206 error:: Error ,
249207 tokenizer:: integer:: { parse, tests:: try_bencode_to_json} ,
250208 } ,
251- rw:: { byte_reader:: ByteReader , string_writer :: StringWriter } ,
209+ rw:: byte_reader:: ByteReader ,
252210 } ;
253211
254212 #[ test]
@@ -358,10 +316,7 @@ mod tests {
358316
359317 let mut reader = ByteReader :: new ( FaultyReader ) ;
360318
361- let mut output = String :: new ( ) ;
362- let mut writer = StringWriter :: new ( & mut output) ;
363-
364- let result = parse ( & mut reader, & mut writer) ;
319+ let result = parse ( & mut reader) ;
365320
366321 assert ! ( matches!( result, Err ( Error :: Io ( _) ) ) ) ;
367322 }
0 commit comments