Skip to content

Commit ad501d2

Browse files
committed
feat(nom5): migrate to nom 5
1 parent e46a7f6 commit ad501d2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+444
-280
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ byteorder = "1"
3434
futures = "0.1"
3535
log = "0.4"
3636
sodiumoxide = "0.2.2"
37-
nom = "3.2"
37+
nom = { git = "https://github.com/Geal/nom.git" }
3838
cookie-factory = "0.2"
3939
get_if_addrs = "0.5"
4040
parking_lot = "0.8"

src/toxcore/binary_io.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
pub use nom::IResult;
55
pub use cookie_factory::GenError;
66

7-
use nom::{le_u8, le_u16};
7+
use nom::number::complete::{le_u8, le_u16};
88
use std::net::{
99
IpAddr,
1010
Ipv4Addr,
@@ -33,7 +33,7 @@ impl ToBytes for IpAddr {
3333
}
3434

3535
impl FromBytes for Ipv4Addr {
36-
named!(from_bytes<Ipv4Addr>, map!(count_fixed!(u8, le_u8, 4),
36+
named!(from_bytes<Ipv4Addr>, map!(count!(le_u8, 4),
3737
|v| Ipv4Addr::new(v[0], v[1], v[2], v[3])
3838
));
3939
}
@@ -51,7 +51,7 @@ impl ToBytes for Ipv4Addr {
5151
}
5252

5353
impl FromBytes for Ipv6Addr {
54-
named!(from_bytes<Ipv6Addr>, map!(count_fixed!(u16, le_u16, 8),
54+
named!(from_bytes<Ipv6Addr>, map!(count!(le_u16, 8),
5555
|v| Ipv6Addr::new(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7])
5656
));
5757
}
@@ -74,7 +74,7 @@ impl ToBytes for Ipv6Addr {
7474

7575
/// Parser that returns the length of the remaining input.
7676
pub fn rest_len(input: &[u8]) -> IResult<&[u8], usize> {
77-
IResult::Done(input, input.len())
77+
Ok((input, input.len()))
7878
}
7979

8080
/// Generator that ensures that length of serialized data does not exceed specified limit.

src/toxcore/dht/codec.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ use crate::toxcore::stats::*;
1010
use bytes::BytesMut;
1111
use cookie_factory::GenError;
1212
use failure::Fail;
13-
use nom::{ErrorKind, Needed};
13+
use nom::{error::ErrorKind, Err,
14+
Needed
15+
};
1416
use tokio::codec::{Decoder, Encoder};
1517

1618
/// A serialized `Packet` should be not longer than 2048 bytes.
@@ -132,9 +134,13 @@ impl Decoder for DhtCodec {
132134
}
133135

134136
match Packet::from_bytes(buf) {
135-
IResult::Incomplete(needed) => Err(DecodeError::incomplete_packet(needed, buf.to_vec())),
136-
IResult::Error(error) => Err(DecodeError::deserialize(error, buf.to_vec())),
137-
IResult::Done(_, packet) => {
137+
Err(Err::Incomplete(needed)) => Err(DecodeError::incomplete_packet(needed, buf.to_vec())),
138+
Err(Err::Error(error)) => {
139+
let (_, kind) = error;
140+
Err(DecodeError::deserialize(kind, buf.to_vec()))
141+
},
142+
Err(Err::Failure(e)) => panic!("Packet deserialize failed with unrecoverable error: {:?}", e),
143+
Ok((_, packet)) => {
138144
// Add 1 to incoming counter
139145
self.stats.counters.increase_incoming();
140146

src/toxcore/dht/daemon_state.rs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ use crate::toxcore::dht::kbucket::*;
1515
use crate::toxcore::dht::ktree::*;
1616

1717
use failure::Fail;
18-
use nom::{Needed, ErrorKind as NomErrorKind};
18+
use nom::{Needed, Err,
19+
error::ErrorKind as NomErrorKind
20+
};
1921

2022
error_kind! {
2123
#[doc = "An error that can occur while serializing/deserializing object."]
@@ -86,11 +88,17 @@ impl DaemonState {
8688
/// Deserialize DHT close list and then re-setup close list, old means that the format of deserialization is old version
8789
pub fn deserialize_old(server: &Server, serialized_data: &[u8]) -> impl Future<Item=(), Error=DeserializeError> + Send {
8890
let nodes = match DhtState::from_bytes(serialized_data) {
89-
IResult::Done(_, DhtState(nodes)) => nodes,
90-
IResult::Incomplete(needed) =>
91-
return Either::A(future::err(DeserializeError::incomplete(needed, serialized_data.to_vec()))),
92-
IResult::Error(error) =>
93-
return Either::A(future::err(DeserializeError::deserialize(error, serialized_data.to_vec()))),
91+
Err(Err::Incomplete(needed)) => {
92+
return Either::A(future::err(DeserializeError::incomplete(needed, serialized_data.to_vec())))
93+
},
94+
Err(Err::Error(error)) => {
95+
let (_, kind) = error;
96+
return Either::A(future::err(DeserializeError::deserialize(kind, serialized_data.to_vec())))
97+
},
98+
Err(Err::Failure(e)) => panic!("DhtState deserialize failed with unrecoverable error: {:?}", e),
99+
Ok((_, DhtState(nodes))) => {
100+
nodes
101+
}
94102
};
95103

96104
let nodes_sender = nodes.iter()
@@ -148,7 +156,7 @@ mod tests {
148156
let serialized_len = serialized_vec.len();
149157
let res = DaemonState::deserialize_old(&alice, &serialized_vec[..serialized_len - 1]).wait();
150158
assert!(res.is_err());
151-
assert_eq!(*res.err().unwrap().kind(), DeserializeErrorKind::IncompleteData { needed: Needed::Size(55), data: serialized_vec[..serialized_len - 1].to_vec() });
159+
assert_eq!(*res.err().unwrap().kind(), DeserializeErrorKind::IncompleteData { needed: Needed::Size(39), data: serialized_vec[..serialized_len - 1].to_vec() });
152160

153161
// test with serialized data corrupted
154162
let serialized_vec = [42; 10];

src/toxcore/dht/packed_node.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*! A pair of SocketAddr & PublicKey.
22
*/
33

4-
use nom::{le_u8, be_u16};
4+
use nom::number::complete::{le_u8, be_u16};
55

66
use std::net::{
77
IpAddr,

src/toxcore/dht/packet/bootstrap_info.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
/*! BootstrapInfo packet
22
*/
33

4-
use nom::{be_u32, rest};
4+
use nom::{number::complete::be_u32,
5+
combinator::rest,
6+
};
57

68
use crate::toxcore::binary_io::*;
79

src/toxcore/dht/packet/cookie.rs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
/*! Cookie struct
22
*/
33

4-
use nom::be_u64;
4+
use nom::{Needed, Err,
5+
number::complete::be_u64,
6+
};
57

68
use std::time::SystemTime;
79

@@ -152,15 +154,18 @@ impl EncryptedCookie {
152154
GetPayloadError::decrypt()
153155
})?;
154156
match Cookie::from_bytes(&decrypted) {
155-
IResult::Incomplete(needed) => {
156-
debug!(target: "Dht", "Cookie return deserialize error: {:?}", needed);
157+
Err(Err::Incomplete(Needed::Unknown)) => {
158+
Err(GetPayloadError::incomplete(Needed::Unknown, self.payload.to_vec()))
159+
},
160+
Err(Err::Incomplete(needed)) => {
157161
Err(GetPayloadError::incomplete(needed, self.payload.to_vec()))
158162
},
159-
IResult::Error(error) => {
160-
debug!(target: "Dht", "Cookie return deserialize error: {:?}", error);
161-
Err(GetPayloadError::deserialize(error, self.payload.to_vec()))
163+
Err(Err::Error(error)) => {
164+
let (_, kind) = error;
165+
Err(GetPayloadError::deserialize(kind, self.payload.to_vec()))
162166
},
163-
IResult::Done(_, payload) => {
167+
Err(Err::Failure(e)) => panic!("Cookie deserialize failed with unrecoverable error: {:?}", e),
168+
Ok((_, payload)) => {
164169
Ok(payload)
165170
}
166171
}
@@ -176,7 +181,7 @@ impl EncryptedCookie {
176181
#[cfg(test)]
177182
mod tests {
178183
use super::*;
179-
use nom::{Needed, ErrorKind};
184+
use nom::error::ErrorKind;
180185

181186
encode_decode_test!(
182187
cookie_encode_decode,
@@ -238,15 +243,15 @@ mod tests {
238243
assert!(decoded_payload.is_err());
239244
assert_eq!(*decoded_payload.err().unwrap().kind(), GetPayloadErrorKind::Deserialize { error: ErrorKind::Eof, payload: invalid_encrypted_cookie.payload });
240245
// Try short incomplete array
241-
let invalid_payload = [];
246+
let invalid_payload = [42, 42];
242247
let invalid_payload_encoded = secretbox::seal(&invalid_payload, &nonce, &symmetric_key);
243248
let invalid_encrypted_cookie = EncryptedCookie {
244249
nonce,
245250
payload: invalid_payload_encoded
246251
};
247252
let decoded_payload = invalid_encrypted_cookie.get_payload(&symmetric_key);
248253
assert!(decoded_payload.is_err());
249-
assert_eq!(*decoded_payload.err().unwrap().kind(), GetPayloadErrorKind::IncompletePayload { needed: Needed::Size(8), payload: invalid_encrypted_cookie.payload });
254+
assert_eq!(*decoded_payload.err().unwrap().kind(), GetPayloadErrorKind::Deserialize { error: ErrorKind::Eof, payload: invalid_encrypted_cookie.payload });
250255
}
251256

252257
#[test]

src/toxcore/dht/packet/cookie_request.rs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
/*! CookieRequest packet
22
*/
33

4-
use nom::be_u64;
4+
use nom::{Needed, Err,
5+
number::complete::be_u64,
6+
};
57

68
use crate::toxcore::binary_io::*;
79
use crate::toxcore::crypto_core::*;
@@ -92,15 +94,18 @@ impl CookieRequest {
9294
GetPayloadError::decrypt()
9395
})?;
9496
match CookieRequestPayload::from_bytes(&decrypted) {
95-
IResult::Incomplete(needed) => {
96-
debug!(target: "Dht", "CookieRequestPayload return deserialize error: {:?}", needed);
97+
Err(Err::Incomplete(Needed::Unknown)) => {
98+
Err(GetPayloadError::incomplete(Needed::Unknown, self.payload.to_vec()))
99+
},
100+
Err(Err::Incomplete(needed)) => {
97101
Err(GetPayloadError::incomplete(needed, self.payload.to_vec()))
98102
},
99-
IResult::Error(error) => {
100-
debug!(target: "Dht", "CookieRequestPayload return deserialize error: {:?}", error);
101-
Err(GetPayloadError::deserialize(error, self.payload.to_vec()))
103+
Err(Err::Error(error)) => {
104+
let (_, kind) = error;
105+
Err(GetPayloadError::deserialize(kind, self.payload.to_vec()))
102106
},
103-
IResult::Done(_, payload) => {
107+
Err(Err::Failure(e)) => panic!("CookieRequestPayload deserialize failed with unrecoverable error: {:?}", e),
108+
Ok((_, payload)) => {
104109
Ok(payload)
105110
}
106111
}

src/toxcore/dht/packet/cookie_response.rs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
/*! CookieResponse packet
22
*/
33

4-
use nom::be_u64;
4+
use nom::{Needed, Err,
5+
number::complete::be_u64,
6+
};
57

68
use crate::toxcore::binary_io::*;
79
use crate::toxcore::crypto_core::*;
@@ -77,15 +79,18 @@ impl CookieResponse {
7779
GetPayloadError::decrypt()
7880
})?;
7981
match CookieResponsePayload::from_bytes(&decrypted) {
80-
IResult::Incomplete(needed) => {
81-
debug!(target: "Dht", "CookieResponsePayload return deserialize error: {:?}", needed);
82+
Err(Err::Incomplete(Needed::Unknown)) => {
83+
Err(GetPayloadError::incomplete(Needed::Unknown, self.payload.to_vec()))
84+
},
85+
Err(Err::Incomplete(needed)) => {
8286
Err(GetPayloadError::incomplete(needed, self.payload.to_vec()))
8387
},
84-
IResult::Error(error) => {
85-
debug!(target: "Dht", "CookieResponsePayload return deserialize error: {:?}", error);
86-
Err(GetPayloadError::deserialize(error, self.payload.to_vec()))
88+
Err(Err::Error(error)) => {
89+
let (_, kind) = error;
90+
Err(GetPayloadError::deserialize(kind, self.payload.to_vec()))
8791
},
88-
IResult::Done(_, payload) => {
92+
Err(Err::Failure(e)) => panic!("CookieResponsePayload deserialize failed with unrecoverable error: {:?}", e),
93+
Ok((_, payload)) => {
8994
Ok(payload)
9095
}
9196
}
@@ -134,7 +139,9 @@ impl ToBytes for CookieResponsePayload {
134139
#[cfg(test)]
135140
mod tests {
136141
use super::*;
137-
use nom::{Needed, ErrorKind};
142+
use nom::{Needed,
143+
error::ErrorKind
144+
};
138145

139146
encode_decode_test!(
140147
cookie_response_encode_decode,

src/toxcore/dht/packet/crypto_data.rs

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
*/
33

44
use byteorder::{ByteOrder, BigEndian};
5-
use nom::{be_u16, be_u32, rest};
5+
use nom::{Needed, Err,
6+
number::complete::{be_u16, be_u32},
7+
combinator::rest,
8+
};
69

710
use crate::toxcore::binary_io::*;
811
use crate::toxcore::crypto_core::*;
@@ -40,7 +43,7 @@ pub struct CryptoData {
4043

4144
impl FromBytes for CryptoData {
4245
named!(from_bytes<CryptoData>, do_parse!(
43-
verify!(rest_len, |len| len <= MAX_CRYPTO_PACKET_SIZE) >>
46+
verify!(rest_len, |len| *len <= MAX_CRYPTO_PACKET_SIZE) >>
4447
tag!("\x1b") >>
4548
nonce_last_bytes: be_u16 >>
4649
payload: rest >>
@@ -91,15 +94,18 @@ impl CryptoData {
9194
GetPayloadError::decrypt()
9295
})?;
9396
match CryptoDataPayload::from_bytes(&decrypted) {
94-
IResult::Incomplete(needed) => {
95-
debug!(target: "Dht", "CryptoDataPayload return deserialize error: {:?}", needed);
97+
Err(Err::Incomplete(Needed::Unknown)) => {
98+
Err(GetPayloadError::incomplete(Needed::Unknown, self.payload.to_vec()))
99+
},
100+
Err(Err::Incomplete(needed)) => {
96101
Err(GetPayloadError::incomplete(needed, self.payload.to_vec()))
97102
},
98-
IResult::Error(error) => {
99-
debug!(target: "Dht", "CryptoDataPayload return deserialize error: {:?}", error);
100-
Err(GetPayloadError::deserialize(error, self.payload.to_vec()))
103+
Err(Err::Error(error)) => {
104+
let (_, kind) = error;
105+
Err(GetPayloadError::deserialize(kind, self.payload.to_vec()))
101106
},
102-
IResult::Done(_, payload) => {
107+
Err(Err::Failure(e)) => panic!("CryptoDataPayload deserialize failed with unrecoverable error: {:?}", e),
108+
Ok((_, payload)) => {
103109
Ok(payload)
104110
}
105111
}
@@ -151,7 +157,7 @@ impl ToBytes for CryptoDataPayload {
151157
#[cfg(test)]
152158
mod tests {
153159
use super::*;
154-
use nom::Needed;
160+
use nom::error::ErrorKind;
155161

156162
encode_decode_test!(
157163
crypto_data_encode_decode,
@@ -239,6 +245,6 @@ mod tests {
239245
};
240246
let decoded_payload = invalid_packet.get_payload(&shared_secret, &nonce);
241247
assert!(decoded_payload.is_err());
242-
assert_eq!(*decoded_payload.err().unwrap().kind(), GetPayloadErrorKind::IncompletePayload { needed: Needed::Size(4), payload: invalid_packet.payload });
248+
assert_eq!(*decoded_payload.err().unwrap().kind(), GetPayloadErrorKind::Deserialize { error: ErrorKind::Eof, payload: invalid_packet.payload });
243249
}
244250
}

0 commit comments

Comments
 (0)