diff -r 7d7f7483459e -r f0c0d2d217c3 rust/hedgewars-engine-messages/src/parser.rs --- a/rust/hedgewars-engine-messages/src/parser.rs Wed Nov 21 17:28:28 2018 +0300 +++ b/rust/hedgewars-engine-messages/src/parser.rs Wed Nov 21 15:49:16 2018 +0100 @@ -3,7 +3,7 @@ use super::messages::{ ConfigEngineMessage::*, EngineMessage::*, KeystrokeAction::*, SyncedEngineMessage::*, - UnorderedEngineMessage::*, UnsyncedEngineMessage::*, *, + UnorderedEngineMessage::*, *, }; macro_rules! eof_slice ( @@ -121,6 +121,19 @@ named!(pub extract_messages<&[u8], Vec >, many0!(complete!(message))); +pub fn extract_message(buf: &[u8]) -> Option<(usize, EngineMessage)> { + let parse_result = message(buf); + match parse_result { + Ok((tail, msg)) => { + let consumed = buf.len() - tail.len(); + + Some((consumed, msg)) + }, + Err(Err::Incomplete(_)) => None, + Err(Err::Error(_)) | Err(Err::Failure(_)) => unreachable!(), + } +} + #[test] fn parse_length() { assert_eq!(length_specifier(b"\x01"), Ok((&b""[..], 1))); @@ -139,6 +152,7 @@ message(b"\x03L\x01\x02"), Ok((&b""[..], Synced(Left(Press), 258))) ); + assert_eq!(message(b"\x01#"), Ok((&b""[..], Synced(TimeWrap, 65535)))); assert_eq!(message(&vec![9, b'p', 255, 133, 151, 1, 0, 2, 0, 0]), Ok((&b""[..], Synced(Put(-31337, 65538), 0)))); @@ -169,4 +183,7 @@ #[test] fn parse_test_general() { assert_eq!(string_tail(b"abc"), Ok((&b""[..], String::from("abc")))); + + assert_eq!(extract_message(b"\x02#"), None); + assert_eq!(extract_message(b"\x01#"), Some((2, Synced(TimeWrap, 65535)))); }