Advertisement
Guest User

Untitled

a guest
Jun 22nd, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.92 KB | None | 0 0
  1. use nom;
  2. use std;
  3. use nom::{digit};
  4. use nom::types::CompleteStr;
  5.  
  6. // MSG <subject> <sid> [reply-to] <#bytes>\r\n[payload]\r\n
  7. #[derive(Debug)]
  8. struct MessageHeader {
  9. subject: String,
  10. sid: u64,
  11. response: Option<String>,
  12. message_len: u64,
  13. }
  14.  
  15. fn is_digit(chr: char) -> bool {
  16. chr == '1' || chr == '0' ||
  17. chr == '2' || chr == '3' ||
  18. chr == '4' || chr == '5' ||
  19. chr == '6' || chr == '7' ||
  20. chr == '8' || chr == '9'
  21. }
  22.  
  23. fn is_not_space(chr: char) -> bool {
  24. chr != ' '
  25. }
  26.  
  27. named!(parse_u64<::nom::types::CompleteStr, u64>,
  28. flat_map!(take_while1_s!(is_digit), parse_to!(u64))
  29. );
  30.  
  31. named!(parse_completestr<::nom::types::CompleteStr, String >, map!(
  32. take_while1_s!(is_not_space),
  33. |r|r.to_string()
  34. ));
  35.  
  36. named!(msg_header<::nom::types::CompleteStr, MessageHeader>,
  37. do_parse!(
  38. tag_s!("MSG") >>
  39. char!(' ') >>
  40. subject: map!(take_while1_s!(is_not_space), |r|r.to_string()) >>
  41. char!(' ') >>
  42. sid: parse_u64 >>
  43. char!(' ') >>
  44. response: opt!(terminated!(parse_completestr, char!(' '))) >>
  45. char!(' ') >>
  46. message_len: parse_u64 >>
  47.  
  48. ( MessageHeader { sid, subject, response, message_len } )
  49. )
  50. );
  51.  
  52. #[cfg(test)]
  53. mod test {
  54. use super::msg_header;
  55. use nom::types::CompleteStr;
  56.  
  57. #[test]
  58. fn msg_header_reply_to() {
  59. let msg = "MSG workdispatch reply.topic 1 30\r\n";
  60. let res = msg_header(CompleteStr(msg));
  61. println!("{:?}", res);
  62. assert!(res.is_ok());
  63. }
  64.  
  65. #[test]
  66. fn msg_header_no_reply() {
  67. let msg = "MSG workdispatch 1 30\r\n";
  68. let res = msg_header(CompleteStr(msg));
  69. println!("{:?}", res);
  70. assert!(res.is_ok());
  71. }
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement