changeset 14265 | f0c0d2d217c3 |
parent 14260 | a239e4243cf9 |
child 14278 | 645e4591361f |
14264:7d7f7483459e | 14265: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 } |