sdp_rs/tokenizers/
origin.rs1use 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}