rust/hedgewars-server/src/protocol/parser.rs
changeset 15112 6a1ba3540fa0
parent 15111 1e45db229f9f
child 15114 a7841105493e
equal deleted inserted replaced
15111:1e45db229f9f 15112:6a1ba3540fa0
   275             |i| cmdc_single_arg(i, "WATCH", u32_line, Watch),
   275             |i| cmdc_single_arg(i, "WATCH", u32_line, Watch),
   276             |i| cmdc_single_arg(i, "VOTE", yes_no_line, Vote),
   276             |i| cmdc_single_arg(i, "VOTE", yes_no_line, Vote),
   277             |i| cmdc_single_arg(i, "FORCE", yes_no_line, ForceVote),
   277             |i| cmdc_single_arg(i, "FORCE", yes_no_line, ForceVote),
   278             |i| cmdc_single_arg(i, "INFO", a_line, Info),
   278             |i| cmdc_single_arg(i, "INFO", a_line, Info),
   279             |i| cmdc_single_arg(i, "MAXTEAMS", u8_line, MaxTeams),
   279             |i| cmdc_single_arg(i, "MAXTEAMS", u8_line, MaxTeams),
   280             |i| cmdc_single_arg(i, "CALLVOTE", |i| opt!(i, voting), CallVote),
   280             |i| cmdc_single_arg(i, "CALLVOTE", voting, |v| CallVote(Some(v))),
   281         ))(input)
   281         ))(input)
   282     }
   282     }
   283 
   283 
   284     precededc(
   284     precededc(
   285         input,
   285         input,
   286         hw_tag("CMD\n"),
   286         hw_tag("CMD\n"),
   287         alt((
   287         alt((
   288             cmd_no_arg_message,
   288             cmd_no_arg_message,
   289             cmd_single_arg_message,
   289             cmd_single_arg_message,
       
   290             |i| tag_no_case("CALLVOTE")(i).map(|(i, _)| (i, CallVote(None))),
   290             |i| {
   291             |i| {
   291                 precededc(i, hw_tag_no_case("GREETING"), opt_space_arg)
   292                 precededc(i, hw_tag_no_case("GREETING"), opt_space_arg)
   292                     .map(|(i, s)| (i, Greeting(s)))
   293                     .map(|(i, s)| (i, Greeting(s)))
   293             },
   294             },
   294             |i| precededc(i, hw_tag_no_case("PART"), opt_space_arg).map(|(i, s)| (i, Part(s))),
   295             |i| precededc(i, hw_tag_no_case("PART"), opt_space_arg).map(|(i, s)| (i, Part(s))),
   558             )
   559             )
   559         },
   560         },
   560     )
   561     )
   561 }
   562 }
   562 
   563 
   563 fn extract_messages(input: &[u8]) -> HwResult<Vec<HwProtocolMessage>> {
       
   564     many0(message)(input)
       
   565 }
       
   566 
       
   567 #[cfg(test)]
   564 #[cfg(test)]
   568 mod test {
   565 mod test {
   569     use super::{extract_messages, message};
   566     use super::message;
   570     use crate::protocol::parser::HwProtocolError;
   567     use crate::protocol::{
   571     use crate::protocol::{messages::HwProtocolMessage::*, test::gen_proto_msg};
   568         messages::HwProtocolMessage::*, parser::HwProtocolError, test::gen_proto_msg,
       
   569     };
   572     use proptest::{proptest, proptest_helper};
   570     use proptest::{proptest, proptest_helper};
   573 
   571 
   574     #[cfg(test)]
   572     #[cfg(test)]
   575     proptest! {
   573     proptest! {
   576         #[test]
   574         #[test]
   617 
   615 
   618         assert_eq!(
   616         assert_eq!(
   619             message(b"QUIT\n1\n2\n\n"),
   617             message(b"QUIT\n1\n2\n\n"),
   620             Err(nom::Err::Error(HwProtocolError::new()))
   618             Err(nom::Err::Error(HwProtocolError::new()))
   621         );
   619         );
   622 
   620     }
   623         assert_eq!(
   621 }
   624             extract_messages(b"\n\n\n\nPING\n\n"),
       
   625             Ok((&b""[..], vec![Ping]))
       
   626         );
       
   627         assert_eq!(
       
   628             extract_messages(b"\n\n\nPING\n\n"),
       
   629             Ok((&b""[..], vec![Ping]))
       
   630         );
       
   631     }
       
   632 }