sdp_nom/lines/
connection.rs

1use nom::{
2    bytes::complete::tag,
3    combinator::{map, opt},
4    sequence::{preceded, tuple},
5    IResult,
6};
7
8use std::net::IpAddr;
9
10#[cfg(test)]
11use std::net::Ipv4Addr;
12
13#[cfg(test)]
14use crate::assert_line;
15use crate::parsers::{line, read_addr, read_ipver, read_number, wsf, IpVer};
16
17/// Connection "c=IN IP4 10.23.42.137"
18#[derive(Clone, PartialEq, Eq)]
19#[cfg_attr(feature = "debug", derive(Debug))]
20#[cfg_attr(
21    feature = "serde",
22    derive(serde::Serialize, serde::Deserialize),
23    serde(rename_all = "camelCase")
24)]
25pub struct Connection {
26    pub ip_ver: IpVer,
27    pub addr: IpAddr,
28    pub mask: Option<u32>,
29}
30
31/// Connection "c=IN IP4 10.23.42.137"
32///
33pub fn connection_line(input: &str) -> IResult<&str, Connection> {
34    line(
35        "c=",
36        preceded(
37            wsf(tag("IN")),
38            map(
39                tuple((
40                    wsf(read_ipver), // ip_ver
41                    read_addr,       // addr
42                    opt(preceded(tag("/"), read_number)),
43                )),
44                |(ip_ver, addr, mask)| (Connection { ip_ver, addr, mask }),
45            ),
46        ),
47    )(input)
48}
49
50#[test]
51fn test_connection_line() {
52    assert_line!(
53        connection_line,
54        "c=IN IP6 fe80::5a55:caff:fe1a:e187",
55        Connection {
56            ip_ver: IpVer::Ip6,
57            addr: "fe80::5a55:caff:fe1a:e187".parse().unwrap(),
58            mask: None,
59        },
60        print
61    );
62    assert_line!(
63        connection_line,
64        "c=IN IP4 10.23.42.137/32",
65        Connection {
66            ip_ver: IpVer::Ip4,
67            addr: IpAddr::V4(Ipv4Addr::new(10, 23, 42, 137)),
68            mask: Some(32),
69        },
70        print
71    );
72    assert_line!(
73        connection_line,
74        "c=IN IP4 10.23.42.137",
75        Connection {
76            ip_ver: IpVer::Ip4,
77            addr: IpAddr::V4(Ipv4Addr::new(10, 23, 42, 137)),
78            mask: None,
79        },
80        print
81    );
82}