sdp_rs/lines/attribute/
fmtp.rs1use crate::{tokenizers::attributes::name_optvalue::Tokenizer as ParamsTokenizer, Error};
2
3pub use crate::tokenizers::attributes::fmtp::Tokenizer;
6
7#[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}