sdp_nom/attributes/
ice.rs1use 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}