sdp_rs/tokenizers/connection/
mod.rs1pub 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}