rust/hedgewars-server/src/protocol/parser.rs
changeset 15116 cce6e707172f
parent 15114 a7841105493e
child 15118 0e59abde6766
equal deleted inserted replaced
15114:a7841105493e 15116:cce6e707172f
    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 }