xref: /webrtc/constraints/src/setting.rs (revision a4acb6a4)
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 From<bool> for MediaTrackSetting {
25     fn from(setting: bool) -> Self {
26         Self::Bool(setting)
27     }
28 }
29 
30 impl From<i64> for MediaTrackSetting {
31     fn from(setting: i64) -> Self {
32         Self::Integer(setting)
33     }
34 }
35 
36 impl From<f64> for MediaTrackSetting {
37     fn from(setting: f64) -> Self {
38         Self::Float(setting)
39     }
40 }
41 
42 impl From<String> for MediaTrackSetting {
43     fn from(setting: String) -> Self {
44         Self::String(setting)
45     }
46 }
47 
48 impl<'a> From<&'a str> for MediaTrackSetting {
49     fn from(setting: &'a str) -> Self {
50         Self::String(setting.to_owned())
51     }
52 }
53 
54 #[cfg(feature = "serde")]
55 #[cfg(test)]
56 mod serde_tests {
57     use crate::macros::test_serde_symmetry;
58 
59     use super::*;
60 
61     type Subject = MediaTrackSetting;
62 
63     #[test]
64     fn bool() {
65         let subject = Subject::Bool(true);
66         let json = serde_json::json!(true);
67 
68         test_serde_symmetry!(subject: subject, json: json);
69     }
70 
71     #[test]
72     fn integer() {
73         let subject = Subject::Integer(42);
74         let json = serde_json::json!(42);
75 
76         test_serde_symmetry!(subject: subject, json: json);
77     }
78 
79     #[test]
80     fn float() {
81         let subject = Subject::Float(4.2);
82         let json = serde_json::json!(4.2);
83 
84         test_serde_symmetry!(subject: subject, json: json);
85     }
86 
87     #[test]
88     fn string() {
89         let subject = Subject::String("string".to_owned());
90         let json = serde_json::json!("string");
91 
92         test_serde_symmetry!(subject: subject, json: json);
93     }
94 }
95