sdp_rs/lines/attribute/
fmtp.rs

1use crate::{tokenizers::attributes::name_optvalue::Tokenizer as ParamsTokenizer, Error};
2
3/// The fmtp tokenizer, which is part of the attribute (`a=`) line. This is low
4/// level stuff and you shouldn't interact directly with it, unless you know what you are doing.
5pub use crate::tokenizers::attributes::fmtp::Tokenizer;
6
7/// The `fmtp` attribute as it appears in the attribute line(s) (`a=`).
8#[derive(Debug, PartialEq, Eq, Ord, PartialOrd, Clone)]
9pub struct Fmtp {
10    pub fmt: String,
11    pub params: String,
12}
13
14impl Fmtp {
15    pub fn params_list(&self) -> Result<Vec<(&str, Option<&str>)>, Error> {
16        use nom::multi::many1;
17
18        let (_, tokenizers) = many1(ParamsTokenizer::tokenize)(&self.params)?;
19
20        Ok(tokenizers.into_iter().map(|t| (t.name, t.value)).collect())
21    }
22}
23
24impl<'a> From<Tokenizer<'a>> for Fmtp {
25    fn from(tokenizer: Tokenizer<'a>) -> Self {
26        Self {
27            fmt: tokenizer.fmt.into(),
28            params: tokenizer.params.into(),
29        }
30    }
31}
32
33impl std::fmt::Display for Fmtp {
34    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
35        write!(f, "{} {}", self.fmt, self.params)
36    }
37}
38
39#[cfg(test)]
40mod tests {
41    use super::*;
42    use std::convert::TryFrom;
43
44    #[test]
45    fn from_str1() {
46        let tokenizer = Tokenizer {
47            fmt: "96",
48            params: "profile-level-id=42e016;max-mbps=108000;max-fs=3600",
49        };
50
51        assert_eq!(
52            Fmtp::try_from(tokenizer),
53            Ok(Fmtp {
54                fmt: "96".into(),
55                params: "profile-level-id=42e016;max-mbps=108000;max-fs=3600".into(),
56            })
57        );
58    }
59
60    #[test]
61    fn params_list1() {
62        let fmtp = Fmtp {
63            fmt: "96".into(),
64            params: "profile-level-id=42e016;max-mbps=108000;max-fs=3600".into(),
65        };
66
67        assert_eq!(
68            fmtp.params_list(),
69            Ok(vec![
70                ("profile-level-id", Some("42e016")),
71                ("max-mbps", Some("108000")),
72                ("max-fs", Some("3600")),
73            ])
74        );
75    }
76
77    #[test]
78    fn params_list2() {
79        let fmtp = Fmtp {
80            fmt: "96".into(),
81            params: "profile-level-id=42e016;max-mbps=108000;max-fs=3600;".into(),
82        };
83
84        assert_eq!(
85            fmtp.params_list(),
86            Ok(vec![
87                ("profile-level-id", Some("42e016")),
88                ("max-mbps", Some("108000")),
89                ("max-fs", Some("3600")),
90            ])
91        );
92    }
93
94    #[test]
95    fn params_list3() {
96        let fmtp = Fmtp {
97            fmt: "96".into(),
98            params: "profile-level-id;max-mbps=108000;max-fs".into(),
99        };
100
101        assert_eq!(
102            fmtp.params_list(),
103            Ok(vec![
104                ("profile-level-id", None),
105                ("max-mbps", Some("108000")),
106                ("max-fs", None),
107            ])
108        );
109    }
110
111    #[test]
112    fn display1() {
113        assert_eq!(
114            Fmtp {
115                fmt: "96".into(),
116                params: "profile-level-id;max-mbps=108000;max-fs".into(),
117            }
118            .to_string(),
119            "96 profile-level-id;max-mbps=108000;max-fs"
120        );
121    }
122}