equal
deleted
inserted
replaced
82 Err(format_err) => Result::Err(Err::Failure(format_err.into())), |
82 Err(format_err) => Result::Err(Err::Failure(format_err.into())), |
83 } |
83 } |
84 } |
84 } |
85 |
85 |
86 fn str_line(input: &[u8]) -> HwResult<&str> { |
86 fn str_line(input: &[u8]) -> HwResult<&str> { |
87 let (i, text) = not_line_ending(input)?; |
87 let (i, text) = not_line_ending(input.clone())?; |
88 Ok((i, convert_utf8(text)?.1)) |
88 if i != input { |
|
89 Ok((i, convert_utf8(text)?.1)) |
|
90 } else { |
|
91 Err(Err::Error(HwProtocolError::new())) |
|
92 } |
89 } |
93 } |
90 |
94 |
91 fn a_line(input: &[u8]) -> HwResult<String> { |
95 fn a_line(input: &[u8]) -> HwResult<String> { |
92 let (i, str) = str_line(input)?; |
96 let (i, str) = str_line(input)?; |
93 Ok((i, str.to_string())) |
97 Ok((i, str.to_string())) |
101 move |i| tag_no_case(tag_str)(i).map(|(i, _)| (i, ())) |
105 move |i| tag_no_case(tag_str)(i).map(|(i, _)| (i, ())) |
102 } |
106 } |
103 |
107 |
104 fn cmd_arg(input: &[u8]) -> HwResult<String> { |
108 fn cmd_arg(input: &[u8]) -> HwResult<String> { |
105 let delimiters = b" \n"; |
109 let delimiters = b" \n"; |
106 let (i, str) = take_while(move |c| !delimiters.contains(&c))(input)?; |
110 let (i, str) = take_while(move |c| !delimiters.contains(&c))(input.clone())?; |
107 Ok((i, convert_utf8(str)?.1.to_string())) |
111 if i != input { |
|
112 Ok((i, convert_utf8(str)?.1.to_string())) |
|
113 } else { |
|
114 Err(Err::Error(HwProtocolError::new())) |
|
115 } |
108 } |
116 } |
109 |
117 |
110 fn u8_line(input: &[u8]) -> HwResult<u8> { |
118 fn u8_line(input: &[u8]) -> HwResult<u8> { |
111 let (i, str) = str_line(input)?; |
119 let (i, str) = str_line(input)?; |
112 Ok((i, convert_from_str(str)?.1)) |
120 Ok((i, convert_from_str(str)?.1)) |
314 }) |
322 }) |
315 .map(|(i, (n, l))| (i, Save(n, l))) |
323 .map(|(i, (n, l))| (i, Save(n, l))) |
316 }, |
324 }, |
317 |i| { |
325 |i| { |
318 let (i, _) = tag_no_case("RND")(i)?; |
326 let (i, _) = tag_no_case("RND")(i)?; |
319 let (i, _) = alt((spaces, peek(end_of_message)))(i)?; |
327 let (i, v) = alt(( |
320 let (i, v) = str_line(i)?; |
328 |i| peek(end_of_message)(i).map(|(i, _)| (i, vec![])), |
321 Ok((i, Rnd(v.split_whitespace().map(String::from).collect()))) |
329 |i| { |
|
330 let (i, _) = spaces(i)?; |
|
331 let (i, v) = separated_list(spaces, cmd_arg)(i)?; |
|
332 Ok((i, v)) |
|
333 }, |
|
334 ))(i)?; |
|
335 Ok((i, Rnd(v))) |
322 }, |
336 }, |
323 )), |
337 )), |
324 ) |
338 ) |
325 } |
339 } |
326 |
340 |
572 } |
586 } |
573 |
587 |
574 #[cfg(test)] |
588 #[cfg(test)] |
575 mod test { |
589 mod test { |
576 use super::message; |
590 use super::message; |
577 use crate::protocol::{ |
591 use crate::{ |
578 messages::HwProtocolMessage::*, parser::HwProtocolError, test::gen_proto_msg, |
592 core::types::GameCfg, |
|
593 protocol::{messages::HwProtocolMessage::*, parser::HwProtocolError, test::gen_proto_msg}, |
579 }; |
594 }; |
580 use proptest::{proptest, proptest_helper}; |
595 use proptest::{proptest, proptest_helper}; |
581 |
596 |
582 #[cfg(test)] |
597 #[cfg(test)] |
583 proptest! { |
598 proptest! { |
622 message(b"CMD\nRND A B\n\n"), |
637 message(b"CMD\nRND A B\n\n"), |
623 Ok((&b""[..], Rnd(vec![String::from("A"), String::from("B")]))) |
638 Ok((&b""[..], Rnd(vec![String::from("A"), String::from("B")]))) |
624 ); |
639 ); |
625 |
640 |
626 assert_eq!( |
641 assert_eq!( |
|
642 message(b"CFG\nSCHEME\na\nA\n\n"), |
|
643 Ok(( |
|
644 &b""[..], |
|
645 Cfg(GameCfg::Scheme("a".to_string(), vec!["A".to_string()])) |
|
646 )) |
|
647 ); |
|
648 |
|
649 assert_eq!( |
627 message(b"QUIT\n1\n2\n\n"), |
650 message(b"QUIT\n1\n2\n\n"), |
628 Err(nom::Err::Error(HwProtocolError::new())) |
651 Err(nom::Err::Error(HwProtocolError::new())) |
629 ); |
652 ); |
630 } |
653 } |
631 } |
654 } |