rust/hedgewars-engine-messages/src/parser.rs
changeset 14260 f0c0d2d217c3
parent 14255 a239e4243cf9
child 14273 645e4591361f
equal deleted inserted replaced
14259:7d7f7483459e 14260:f0c0d2d217c3
     1 use nom::{Err::Error, *};
     1 use nom::{Err::Error, *};
     2 use std::str;
     2 use std::str;
     3 
     3 
     4 use super::messages::{
     4 use super::messages::{
     5     ConfigEngineMessage::*, EngineMessage::*, KeystrokeAction::*, SyncedEngineMessage::*,
     5     ConfigEngineMessage::*, EngineMessage::*, KeystrokeAction::*, SyncedEngineMessage::*,
     6     UnorderedEngineMessage::*, UnsyncedEngineMessage::*, *,
     6     UnorderedEngineMessage::*, *,
     7 };
     7 };
     8 
     8 
     9 macro_rules! eof_slice (
     9 macro_rules! eof_slice (
    10   ($i:expr,) => (
    10   ($i:expr,) => (
    11     {
    11     {
   119     )
   119     )
   120 );
   120 );
   121 
   121 
   122 named!(pub extract_messages<&[u8], Vec<EngineMessage> >, many0!(complete!(message)));
   122 named!(pub extract_messages<&[u8], Vec<EngineMessage> >, many0!(complete!(message)));
   123 
   123 
       
   124 pub fn extract_message(buf: &[u8]) -> Option<(usize, EngineMessage)> {
       
   125     let parse_result = message(buf);
       
   126     match parse_result {
       
   127         Ok((tail, msg)) => {
       
   128             let consumed = buf.len() - tail.len();
       
   129 
       
   130             Some((consumed, msg))
       
   131         },
       
   132         Err(Err::Incomplete(_)) => None,
       
   133         Err(Err::Error(_)) | Err(Err::Failure(_)) => unreachable!(),
       
   134     }
       
   135 }
       
   136 
   124 #[test]
   137 #[test]
   125 fn parse_length() {
   138 fn parse_length() {
   126     assert_eq!(length_specifier(b"\x01"), Ok((&b""[..], 1)));
   139     assert_eq!(length_specifier(b"\x01"), Ok((&b""[..], 1)));
   127     assert_eq!(length_specifier(b"\x00"), Ok((&b""[..], 0)));
   140     assert_eq!(length_specifier(b"\x00"), Ok((&b""[..], 0)));
   128     assert_eq!(length_specifier(b"\x3f"), Ok((&b""[..], 63)));
   141     assert_eq!(length_specifier(b"\x3f"), Ok((&b""[..], 63)));
   137 fn parse_synced_messages() {
   150 fn parse_synced_messages() {
   138     assert_eq!(
   151     assert_eq!(
   139         message(b"\x03L\x01\x02"),
   152         message(b"\x03L\x01\x02"),
   140         Ok((&b""[..], Synced(Left(Press), 258)))
   153         Ok((&b""[..], Synced(Left(Press), 258)))
   141     );
   154     );
       
   155 
   142     assert_eq!(message(b"\x01#"), Ok((&b""[..], Synced(TimeWrap, 65535))));
   156     assert_eq!(message(b"\x01#"), Ok((&b""[..], Synced(TimeWrap, 65535))));
   143 
   157 
   144     assert_eq!(message(&vec![9, b'p', 255, 133, 151, 1, 0, 2, 0, 0]), Ok((&b""[..], Synced(Put(-31337, 65538), 0))));
   158     assert_eq!(message(&vec![9, b'p', 255, 133, 151, 1, 0, 2, 0, 0]), Ok((&b""[..], Synced(Put(-31337, 65538), 0))));
   145 }
   159 }
   146 
   160 
   167 }
   181 }
   168 
   182 
   169 #[test]
   183 #[test]
   170 fn parse_test_general() {
   184 fn parse_test_general() {
   171     assert_eq!(string_tail(b"abc"), Ok((&b""[..], String::from("abc"))));
   185     assert_eq!(string_tail(b"abc"), Ok((&b""[..], String::from("abc"))));
       
   186 
       
   187     assert_eq!(extract_message(b"\x02#"), None);
       
   188     assert_eq!(extract_message(b"\x01#"), Some((2, Synced(TimeWrap, 65535))));
   172 }
   189 }