sdp_rs/tokenizers/
origin.rs

1use crate::TResult;
2
3#[derive(Debug, PartialEq, Eq, Clone)]
4pub struct Tokenizer<'a> {
5    pub username: &'a str,
6    pub sess_id: &'a str,
7    pub sess_version: &'a str,
8    pub nettype: &'a str,
9    pub addrtype: &'a str,
10    pub unicast_address: &'a str,
11}
12
13impl<'a> Tokenizer<'a> {
14    pub fn tokenize(part: &'a str) -> TResult<'a, Self> {
15        use crate::parser_utils::*;
16        use nom::{bytes::complete::tag, sequence::preceded};
17
18        let (rem, line) = preceded(tag("o="), until_newline)(part)?;
19
20        let (line_rem, username) = until_space(line)?;
21        let (line_rem, sess_id) = until_space(line_rem)?;
22        let (line_rem, sess_version) = until_space(line_rem)?;
23        let (line_rem, nettype) = until_space(line_rem)?;
24        let (unicast_address, addrtype) = until_space(line_rem)?;
25
26        Ok((
27            rem,
28            Tokenizer {
29                username,
30                sess_id,
31                sess_version,
32                nettype,
33                addrtype,
34                unicast_address,
35            },
36        ))
37    }
38}
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43
44    #[test]
45    fn tokenizer() {
46        let origin = concat!("o=jdoe 3724394400 3724394405 IN IP4 198.51.100.1\r\nsomething");
47
48        assert_eq!(
49            Tokenizer::tokenize(origin),
50            Ok((
51                "something",
52                Tokenizer {
53                    username: "jdoe",
54                    sess_id: "3724394400",
55                    sess_version: "3724394405",
56                    nettype: "IN",
57                    addrtype: "IP4",
58                    unicast_address: "198.51.100.1"
59                }
60            )),
61        );
62    }
63}