xref: /webrtc/constraints/src/setting.rs (revision 5d8fe953)
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     /// A boolean-valued track setting.
19     Bool(bool),
20     /// An integer-valued track setting.
21     Integer(i64),
22     /// A floating-point-valued track setting.
23     Float(f64),
24     /// A string-valued track setting.
25     String(String),
26 }
27 
28 impl std::fmt::Display for MediaTrackSetting {
fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result29     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
30         match self {
31             Self::Bool(setting) => f.write_fmt(format_args!("{setting:?}")),
32             Self::Integer(setting) => f.write_fmt(format_args!("{setting:?}")),
33             Self::Float(setting) => f.write_fmt(format_args!("{setting:?}")),
34             Self::String(setting) => f.write_fmt(format_args!("{setting:?}")),
35         }
36     }
37 }
38 
39 impl From<bool> for MediaTrackSetting {
from(setting: bool) -> Self40     fn from(setting: bool) -> Self {
41         Self::Bool(setting)
42     }
43 }
44 
45 impl From<i64> for MediaTrackSetting {
from(setting: i64) -> Self46     fn from(setting: i64) -> Self {
47         Self::Integer(setting)
48     }
49 }
50 
51 impl From<f64> for MediaTrackSetting {
from(setting: f64) -> Self52     fn from(setting: f64) -> Self {
53         Self::Float(setting)
54     }
55 }
56 
57 impl From<String> for MediaTrackSetting {
from(setting: String) -> Self58     fn from(setting: String) -> Self {
59         Self::String(setting)
60     }
61 }
62 
63 impl<'a> From<&'a str> for MediaTrackSetting {
from(setting: &'a str) -> Self64     fn from(setting: &'a str) -> Self {
65         Self::String(setting.to_owned())
66     }
67 }
68 
69 #[cfg(test)]
70 mod tests {
71     use super::*;
72 
73     type Subject = MediaTrackSetting;
74 
75     mod from {
76         use super::*;
77 
78         #[test]
bool()79         fn bool() {
80             let actual = Subject::from(true);
81             let expected = Subject::Bool(true);
82 
83             assert_eq!(actual, expected);
84         }
85 
86         #[test]
integer()87         fn integer() {
88             let actual = Subject::from(42);
89             let expected = Subject::Integer(42);
90 
91             assert_eq!(actual, expected);
92         }
93 
94         #[test]
float()95         fn float() {
96             let actual = Subject::from(4.2);
97             let expected = Subject::Float(4.2);
98 
99             assert_eq!(actual, expected);
100         }
101 
102         #[test]
string()103         fn string() {
104             let actual = Subject::from("string".to_owned());
105             let expected = Subject::String("string".to_owned());
106 
107             assert_eq!(actual, expected);
108         }
109     }
110 
111     #[test]
to_string()112     fn to_string() {
113         assert_eq!(Subject::from(true).to_string(), "true");
114         assert_eq!(Subject::from(42).to_string(), "42");
115         assert_eq!(Subject::from(4.2).to_string(), "4.2");
116         assert_eq!(Subject::from("string".to_owned()).to_string(), "\"string\"");
117     }
118 }
119 
120 #[cfg(feature = "serde")]
121 #[cfg(test)]
122 mod serde_tests {
123     use crate::macros::test_serde_symmetry;
124 
125     use super::*;
126 
127     type Subject = MediaTrackSetting;
128 
129     #[test]
bool()130     fn bool() {
131         let subject = Subject::Bool(true);
132         let json = serde_json::json!(true);
133 
134         test_serde_symmetry!(subject: subject, json: json);
135     }
136 
137     #[test]
integer()138     fn integer() {
139         let subject = Subject::Integer(42);
140         let json = serde_json::json!(42);
141 
142         test_serde_symmetry!(subject: subject, json: json);
143     }
144 
145     #[test]
float()146     fn float() {
147         let subject = Subject::Float(4.2);
148         let json = serde_json::json!(4.2);
149 
150         test_serde_symmetry!(subject: subject, json: json);
151     }
152 
153     #[test]
string()154     fn string() {
155         let subject = Subject::String("string".to_owned());
156         let json = serde_json::json!("string");
157 
158         test_serde_symmetry!(subject: subject, json: json);
159     }
160 }
161