Skip to content

Commit 75ffdb4

Browse files
committed
refactor: remove writer from tokenizer integer parser
1 parent 77ad5af commit 75ffdb4

File tree

4 files changed

+67
-147
lines changed

4 files changed

+67
-147
lines changed

src/parsers/error.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,18 +44,18 @@ pub enum Error {
4444
/// The main parser parses integers by reading bytes until it finds the
4545
/// end of the integer. This error is raised when the byte read is not a
4646
/// valid byte for an integer bencoded value.
47-
#[error("Unexpected byte parsing integer; {0}; {1}")]
48-
UnexpectedByteParsingInteger(ReadContext, WriteContext),
47+
#[error("Unexpected byte parsing integer; {0}")]
48+
UnexpectedByteParsingInteger(ReadContext),
4949

5050
/// Unexpected end of input parsing integer.
5151
///
5252
/// The input ends before the integer ends.
53-
#[error("Unexpected end of input parsing integer; {0}; {1}")]
54-
UnexpectedEndOfInputParsingInteger(ReadContext, WriteContext),
53+
#[error("Unexpected end of input parsing integer; {0}")]
54+
UnexpectedEndOfInputParsingInteger(ReadContext),
5555

5656
/// Leading zeros in integers are not allowed, for example b'i00e'.
57-
#[error("Leading zeros in integers are not allowed, for example b'i00e'; {0}; {1}")]
58-
LeadingZerosInIntegersNotAllowed(ReadContext, WriteContext),
57+
#[error("Leading zeros in integers are not allowed, for example b'i00e'; {0}")]
58+
LeadingZerosInIntegersNotAllowed(ReadContext),
5959

6060
// Strings
6161
/// Invalid string length byte, expected a digit.

src/parsers/integer.rs

Lines changed: 28 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::io::{self, Read};
66
use crate::rw::{byte_reader::ByteReader, writer::Writer};
77

88
use super::{
9-
error::{Error, ReadContext, WriteContext},
9+
error::{Error, ReadContext},
1010
tokenizer::BENCODE_END_INTEGER,
1111
};
1212

@@ -40,7 +40,7 @@ pub fn parse<R: Read, W: Writer>(
4040
let mut value = vec![];
4141

4242
loop {
43-
let byte = next_byte(reader, writer)?;
43+
let byte = next_byte(reader)?;
4444

4545
let char = byte as char;
4646

@@ -65,18 +65,11 @@ pub fn parse<R: Read, W: Writer>(
6565

6666
StateExpecting::DigitOrEnd
6767
} 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-
));
68+
return Err(Error::UnexpectedByteParsingInteger(ReadContext {
69+
byte: Some(byte),
70+
pos: reader.input_byte_counter(),
71+
latest_bytes: reader.captured_bytes(),
72+
}));
8073
}
8174
}
8275
StateExpecting::DigitAfterSign => {
@@ -90,18 +83,11 @@ pub fn parse<R: Read, W: Writer>(
9083

9184
StateExpecting::DigitOrEnd
9285
} 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-
));
86+
return Err(Error::UnexpectedByteParsingInteger(ReadContext {
87+
byte: Some(byte),
88+
pos: reader.input_byte_counter(),
89+
latest_bytes: reader.captured_bytes(),
90+
}));
10591
}
10692
}
10793
StateExpecting::DigitOrEnd => {
@@ -110,36 +96,22 @@ pub fn parse<R: Read, W: Writer>(
11096
value.push(byte);
11197

11298
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-
));
99+
return Err(Error::LeadingZerosInIntegersNotAllowed(ReadContext {
100+
byte: Some(byte),
101+
pos: reader.input_byte_counter(),
102+
latest_bytes: reader.captured_bytes(),
103+
}));
125104
}
126105

127106
StateExpecting::DigitOrEnd
128107
} else if byte == BENCODE_END_INTEGER {
129108
return Ok(value);
130109
} 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-
));
110+
return Err(Error::UnexpectedByteParsingInteger(ReadContext {
111+
byte: Some(byte),
112+
pos: reader.input_byte_counter(),
113+
latest_bytes: reader.captured_bytes(),
114+
}));
143115
}
144116
}
145117
};
@@ -151,23 +123,16 @@ pub fn parse<R: Read, W: Writer>(
151123
/// # Errors
152124
///
153125
/// 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> {
126+
fn next_byte<R: Read>(reader: &mut ByteReader<R>) -> Result<u8, Error> {
155127
match reader.read_byte() {
156128
Ok(byte) => Ok(byte),
157129
Err(err) => {
158130
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-
));
131+
return Err(Error::UnexpectedEndOfInputParsingInteger(ReadContext {
132+
byte: None,
133+
pos: reader.input_byte_counter(),
134+
latest_bytes: reader.captured_bytes(),
135+
}));
171136
}
172137
Err(err.into())
173138
}

src/parsers/tokenizer/integer.rs

Lines changed: 32 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
//! It reads bencoded bytes from the input and writes JSON bytes to the output.
44
use std::io::{self, Read};
55

6-
use crate::rw::{byte_reader::ByteReader, writer::Writer};
6+
use crate::rw::byte_reader::ByteReader;
77

88
use 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
}

src/parsers/tokenizer/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ impl<R: Read> BencodeTokenizer<R> {
6060
Some(peeked_byte) => {
6161
match peeked_byte {
6262
BENCODE_BEGIN_INTEGER => {
63-
let value = integer::parse(&mut self.byte_reader, &mut null_writer)?;
63+
let value = integer::parse(&mut self.byte_reader)?;
6464
Ok(Some(BencodeToken::Integer(value)))
6565
}
6666
b'0'..=b'9' => {

0 commit comments

Comments
 (0)