xref: /webrtc/constraints/src/setting.rs (revision c19675fc)
1 #[cfg(feature = "serde")]
2 use serde::{Deserialize, Serialize};
3 
4 /// A single [setting][media_track_settings] value of a [`MediaStreamTrack`][media_stream_track] object.
5 ///
6 /// # W3C Spec Compliance
7 ///
8 /// There exists no corresponding type in the W3C ["Media Capture and Streams"][media_capture_and_streams_spec] spec.
9 ///
10 /// [media_stream_track]: https://www.w3.org/TR/mediacapture-streams/#dom-mediastreamtrack
11 /// [media_track_settings]: https://www.w3.org/TR/mediacapture-streams/#dom-mediatracksettings
12 /// [media_track_supported_constraints]: https://www.w3.org/TR/mediacapture-streams/#dom-mediatracksupportedconstraints
13 /// [media_capture_and_streams_spec]: https://www.w3.org/TR/mediacapture-streams
14 #[derive(Debug, Clone, PartialEq)]
15 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
16 #[cfg_attr(feature = "serde", serde(untagged))]
17 pub enum MediaTrackSetting {
18     Bool(bool),
19     Integer(i64),
20     Float(f64),
21     String(String),
22 }
23 
24 impl std::fmt::Display for MediaTrackSetting {
25     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
26         match self {
27             Self::Bool(setting) => f.write_fmt(format_args!("{:?}", setting)),
28             Self::Integer(setting) => f.write_fmt(format_args!("{:?}", setting)),
29             Self::Float(setting) => f.write_fmt(format_args!("{:?}", setting)),
30             Self::String(setting) => f.write_fmt(format_args!("{:?}", setting)),
31         }
32     }
33 }
34 
35 impl From<bool> for MediaTrackSetting {
36     fn from(setting: bool) -> Self {
37         Self::Bool(setting)
38     }
39 }
40 
41 impl From<i64> for MediaTrackSetting {
42     fn from(setting: i64) -> Self {
43         Self::Integer(setting)
44     }
45 }
46 
47 impl From<f64> for MediaTrackSetting {
48     fn from(setting: f64) -> Self {
49         Self::Float(setting)
50     }
51 }
52 
53 impl From<String> for MediaTrackSetting {
54     fn from(setting: String) -> Self {
55         Self::String(setting)
56     }
57 }
58 
59 impl<'a> From<&'a str> for MediaTrackSetting {
60     fn from(setting: &'a str) -> Self {
61         Self::String(setting.to_owned())
62     }
63 }
64 
65 #[cfg(test)]
66 mod tests {
67     use super::*;
68 
69     type Subject = MediaTrackSetting;
70 
71     mod from {
72         use super::*;
73 
74         #[test]
75         fn bool() {
76             let actual = Subject::from(true);
77             let expected = Subject::Bool(true);
78 
79             assert_eq!(actual, expected);
80         }
81 
82         #[test]
83         fn integer() {
84             let actual = Subject::from(42);
85             let expected = Subject::Integer(42);
86 
87             assert_eq!(actual, expected);
88         }
89 
90         #[test]
91         fn float() {
92             let actual = Subject::from(4.2);
93             let expected = Subject::Float(4.2);
94 
95             assert_eq!(actual, expected);
96         }
97 
98         #[test]
99         fn string() {
100             let actual = Subject::from("string".to_owned());
101             let expected = Subject::String("string".to_owned());
102 
103             assert_eq!(actual, expected);
104         }
105     }
106 
107     #[test]
108     fn to_string() {
109         assert_eq!(Subject::from(true).to_string(), "true");
110         assert_eq!(Subject::from(42).to_string(), "42");
111         assert_eq!(Subject::from(4.2).to_string(), "4.2");
112         assert_eq!(Subject::from("string".to_owned()).to_string(), "\"string\"");
113     }
114 }
115 
116 #[cfg(feature = "serde")]
117 #[cfg(test)]
118 mod serde_tests {
119     use crate::macros::test_serde_symmetry;
120 
121     use super::*;
122 
123     type Subject = MediaTrackSetting;
124 
125     #[test]
126     fn bool() {
127         let subject = Subject::Bool(true);
128         let json = serde_json::json!(true);
129 
130         test_serde_symmetry!(subject: subject, json: json);
131     }
132 
133     #[test]
134     fn integer() {
135         let subject = Subject::Integer(42);
136         let json = serde_json::json!(42);
137 
138         test_serde_symmetry!(subject: subject, json: json);
139     }
140 
141     #[test]
142     fn float() {
143         let subject = Subject::Float(4.2);
144         let json = serde_json::json!(4.2);
145 
146         test_serde_symmetry!(subject: subject, json: json);
147     }
148 
149     #[test]
150     fn string() {
151         let subject = Subject::String("string".to_owned());
152         let json = serde_json::json!("string");
153 
154         test_serde_symmetry!(subject: subject, json: json);
155     }
156 }
157