sdp_nom/lines/
connection.rs1use 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#[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
31pub 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), read_addr, 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}