sdp_rs/tokenizers/connection/
mod.rs

1pub mod connection_address;
2
3use crate::TResult;
4
5#[derive(Debug, PartialEq, Eq, Clone)]
6pub struct Tokenizer<'a> {
7    pub nettype: &'a str,
8    pub addrtype: &'a str,
9    pub connection_address: connection_address::Tokenizer<'a>,
10}
11
12impl<'a> Tokenizer<'a> {
13    pub fn tokenize(part: &'a str) -> TResult<'a, Self> {
14        use crate::parser_utils::*;
15        use nom::{bytes::complete::tag, sequence::preceded};
16
17        let (rem, values) = preceded(tag("c="), until_newline)(part)?;
18        let (rem_line, nettype) = until_space(values)?;
19        let (rem_line, addrtype) = until_space(rem_line)?;
20        let (_, connection_address) = connection_address::Tokenizer::tokenize(rem_line)?;
21
22        Ok((
23            rem,
24            Tokenizer {
25                nettype,
26                addrtype,
27                connection_address,
28            },
29        ))
30    }
31}
32
33impl<'a, T: Into<connection_address::Tokenizer<'a>>> From<(&'a str, &'a str, T)> for Tokenizer<'a> {
34    fn from((nettype, addrtype, connection_address): (&'a str, &'a str, T)) -> Self {
35        Self {
36            nettype,
37            addrtype,
38            connection_address: connection_address.into(),
39        }
40    }
41}
42
43#[cfg(test)]
44mod tests {
45    use super::*;
46
47    #[test]
48    fn connection_tokenizer1() {
49        let connection = concat!("c=IN IP4 198.51.100.1\r\nsomething");
50
51        assert_eq!(
52            Tokenizer::tokenize(connection),
53            Ok((
54                "something",
55                Tokenizer {
56                    nettype: "IN",
57                    addrtype: "IP4",
58                    connection_address: connection_address::Tokenizer::from("198.51.100.1")
59                }
60            )),
61        );
62    }
63
64    #[test]
65    fn connection_tokenizer2() {
66        let connection = concat!("c=IN IP4 233.252.0.1/127\r\nsomething");
67
68        assert_eq!(
69            Tokenizer::tokenize(connection),
70            Ok((
71                "something",
72                Tokenizer {
73                    nettype: "IN",
74                    addrtype: "IP4",
75                    connection_address: connection_address::Tokenizer {
76                        base: "233.252.0.1",
77                        ttl: Some("127"),
78                        numaddr: None
79                    }
80                }
81            )),
82        );
83    }
84
85    #[test]
86    fn connection_tokenizer3() {
87        let connection = concat!("c=IN IP4 233.252.0.1/127/2\r\nsomething");
88
89        assert_eq!(
90            Tokenizer::tokenize(connection),
91            Ok((
92                "something",
93                Tokenizer {
94                    nettype: "IN",
95                    addrtype: "IP4",
96                    connection_address: connection_address::Tokenizer {
97                        base: "233.252.0.1",
98                        ttl: Some("127"),
99                        numaddr: Some("2")
100                    }
101                }
102            )),
103        );
104    }
105}