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(test)] 66 mod tests { 67 use super::*; 68 69 type Subject = MediaTrackSetting; 70 71 mod from { 72 use super::*; 73 74 #[test] 75 fn bool() { 76 let actual = Subject::from(true); 77 let expected = Subject::Bool(true); 78 79 assert_eq!(actual, expected); 80 } 81 82 #[test] 83 fn integer() { 84 let actual = Subject::from(42); 85 let expected = Subject::Integer(42); 86 87 assert_eq!(actual, expected); 88 } 89 90 #[test] 91 fn float() { 92 let actual = Subject::from(4.2); 93 let expected = Subject::Float(4.2); 94 95 assert_eq!(actual, expected); 96 } 97 98 #[test] 99 fn string() { 100 let actual = Subject::from("string".to_owned()); 101 let expected = Subject::String("string".to_owned()); 102 103 assert_eq!(actual, expected); 104 } 105 } 106 107 #[test] 108 fn to_string() { 109 assert_eq!(Subject::from(true).to_string(), "true"); 110 assert_eq!(Subject::from(42).to_string(), "42"); 111 assert_eq!(Subject::from(4.2).to_string(), "4.2"); 112 assert_eq!(Subject::from("string".to_owned()).to_string(), "\"string\""); 113 } 114 } 115 116 #[cfg(feature = "serde")] 117 #[cfg(test)] 118 mod serde_tests { 119 use crate::macros::test_serde_symmetry; 120 121 use super::*; 122 123 type Subject = MediaTrackSetting; 124 125 #[test] 126 fn bool() { 127 let subject = Subject::Bool(true); 128 let json = serde_json::json!(true); 129 130 test_serde_symmetry!(subject: subject, json: json); 131 } 132 133 #[test] 134 fn integer() { 135 let subject = Subject::Integer(42); 136 let json = serde_json::json!(42); 137 138 test_serde_symmetry!(subject: subject, json: json); 139 } 140 141 #[test] 142 fn float() { 143 let subject = Subject::Float(4.2); 144 let json = serde_json::json!(4.2); 145 146 test_serde_symmetry!(subject: subject, json: json); 147 } 148 149 #[test] 150 fn string() { 151 let subject = Subject::String("string".to_owned()); 152 let json = serde_json::json!("string"); 153 154 test_serde_symmetry!(subject: subject, json: json); 155 } 156 } 157