Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use nom;
- use std;
- use nom::{digit};
- use nom::types::CompleteStr;
- // MSG <subject> <sid> [reply-to] <#bytes>\r\n[payload]\r\n
- #[derive(Debug)]
- struct MessageHeader {
- subject: String,
- sid: u64,
- response: Option<String>,
- message_len: u64,
- }
- fn is_digit(chr: char) -> bool {
- chr == '1' || chr == '0' ||
- chr == '2' || chr == '3' ||
- chr == '4' || chr == '5' ||
- chr == '6' || chr == '7' ||
- chr == '8' || chr == '9'
- }
- fn is_not_space(chr: char) -> bool {
- chr != ' '
- }
- named!(parse_u64<::nom::types::CompleteStr, u64>,
- flat_map!(take_while1_s!(is_digit), parse_to!(u64))
- );
- named!(parse_completestr<::nom::types::CompleteStr, String >, map!(
- take_while1_s!(is_not_space),
- |r|r.to_string()
- ));
- named!(msg_header<::nom::types::CompleteStr, MessageHeader>,
- do_parse!(
- tag_s!("MSG") >>
- char!(' ') >>
- subject: map!(take_while1_s!(is_not_space), |r|r.to_string()) >>
- char!(' ') >>
- sid: parse_u64 >>
- char!(' ') >>
- response: opt!(terminated!(parse_completestr, char!(' '))) >>
- char!(' ') >>
- message_len: parse_u64 >>
- ( MessageHeader { sid, subject, response, message_len } )
- )
- );
- #[cfg(test)]
- mod test {
- use super::msg_header;
- use nom::types::CompleteStr;
- #[test]
- fn msg_header_reply_to() {
- let msg = "MSG workdispatch 1 reply.topic 30\r\n";
- let res = msg_header(CompleteStr(msg));
- println!("{:?}", res);
- assert!(res.is_ok());
- }
- #[test]
- fn msg_header_no_reply() {
- let msg = "MSG workdispatch 1 30\r\n";
- let res = msg_header(CompleteStr(msg));
- println!("{:?}", res);
- assert!(res.is_ok());
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement