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