sdp_nom/attributes/
ice.rs

1use std::borrow::Cow;
2
3use derive_into_owned::IntoOwned;
4use nom::{branch::alt, bytes::complete::tag, combinator::map, IResult};
5
6#[cfg(test)]
7use crate::assert_line;
8use crate::parsers::*;
9
10#[derive(Clone, IntoOwned, PartialEq, Eq)]
11#[cfg_attr(feature = "debug", derive(Debug))]
12#[cfg_attr(
13    feature = "serde",
14    derive(serde::Serialize, serde::Deserialize),
15    serde(rename_all = "camelCase")
16)]
17#[non_exhaustive]
18pub enum IceParameter<'a> {
19    Ufrag(Cow<'a, str>),
20    Pwd(Cow<'a, str>),
21    Options(Cow<'a, str>),
22    Mismatch,
23    Lite,
24}
25
26#[derive(Default, IntoOwned, PartialEq, Eq)]
27#[cfg_attr(feature = "debug", derive(Debug))]
28#[cfg_attr(
29    feature = "serde",
30    derive(serde::Serialize, serde::Deserialize),
31    serde(rename_all = "camelCase")
32)]
33pub struct Ice<'a> {
34    pub ufrag: Option<Cow<'a, str>>,
35    pub pwd: Option<Cow<'a, str>>,
36    pub options: Option<Cow<'a, str>>,
37}
38
39pub fn ice_parameter_line(input: &str) -> IResult<&str, IceParameter> {
40    alt((
41        attribute("ice-ufrag", map(cowify(read_string), IceParameter::Ufrag)),
42        attribute("ice-pwd", map(cowify(read_string), IceParameter::Pwd)),
43        attribute(
44            "ice-options",
45            map(cowify(read_string), IceParameter::Options),
46        ),
47        a_line(map(tag("ice-mismatch"), |_| IceParameter::Mismatch)),
48        a_line(map(tag("ice-lite"), |_| IceParameter::Lite)),
49    ))(input)
50}
51
52#[test]
53fn test_ice_parameters() {
54    assert_line!(
55        ice_parameter_line,
56        "a=ice-ufrag:Oyef7uvBlwafI3hT",
57        IceParameter::Ufrag("Oyef7uvBlwafI3hT".into()),
58        print
59    );
60    assert_line!(
61        ice_parameter_line,
62        "a=ice-pwd:T0teqPLNQQOf+5W+ls+P2p16",
63        IceParameter::Pwd("T0teqPLNQQOf+5W+ls+P2p16".into()),
64        print
65    );
66    assert_line!(
67        ice_parameter_line,
68        "a=ice-ufrag:x+m/",
69        IceParameter::Ufrag("x+m/".into()),
70        print
71    );
72    assert_line!(
73        ice_parameter_line,
74        "a=ice-pwd:Vf2pbpatEroIg6NAaVCIGL94",
75        IceParameter::Pwd("Vf2pbpatEroIg6NAaVCIGL94".into()),
76        print
77    );
78    assert_line!(
79        ice_parameter_line,
80        "a=ice-options:trickle",
81        IceParameter::Options("trickle".into()),
82        print
83    );
84    assert_line!(ice_parameter_line, "a=ice-lite", IceParameter::Lite, print);
85}