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