xref: /webrtc/constraints/src/setting.rs (revision 2dfc7374)
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(feature = "serde")]
66 #[cfg(test)]
67 mod serde_tests {
68     use crate::macros::test_serde_symmetry;
69 
70     use super::*;
71 
72     type Subject = MediaTrackSetting;
73 
74     #[test]
75     fn bool() {
76         let subject = Subject::Bool(true);
77         let json = serde_json::json!(true);
78 
79         test_serde_symmetry!(subject: subject, json: json);
80     }
81 
82     #[test]
83     fn integer() {
84         let subject = Subject::Integer(42);
85         let json = serde_json::json!(42);
86 
87         test_serde_symmetry!(subject: subject, json: json);
88     }
89 
90     #[test]
91     fn float() {
92         let subject = Subject::Float(4.2);
93         let json = serde_json::json!(4.2);
94 
95         test_serde_symmetry!(subject: subject, json: json);
96     }
97 
98     #[test]
99     fn string() {
100         let subject = Subject::String("string".to_owned());
101         let json = serde_json::json!("string");
102 
103         test_serde_symmetry!(subject: subject, json: json);
104     }
105 }
106