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