1bca24136SVincent Esche #[cfg(feature = "serde")] 2bca24136SVincent Esche use serde::{Deserialize, Serialize}; 3bca24136SVincent Esche 4bca24136SVincent Esche /// A capability specifying a range of supported values. 5bca24136SVincent Esche /// 6bca24136SVincent Esche /// # W3C Spec Compliance 7bca24136SVincent Esche /// 8bca24136SVincent Esche /// Corresponds to [`sequence<T>`][sequence] from the W3C ["WebIDL"][webidl_spec] spec: 9bca24136SVincent Esche /// 10bca24136SVincent Esche /// | Rust | W3C | 11bca24136SVincent Esche /// | ----------------------------------------- | --------------------- | 12bca24136SVincent Esche /// | `MediaTrackValueSequenceCapability<bool>` | `sequence<boolean>` | 13bca24136SVincent Esche /// | `MediaTrackValueSequenceCapability<String>` | `sequence<DOMString>` | 14bca24136SVincent Esche /// 15bca24136SVincent Esche /// [sequence]: https://webidl.spec.whatwg.org/#idl-sequence 16bca24136SVincent Esche /// [webidl_spec]: https://webidl.spec.whatwg.org/ 17c27a9ba1SVincent Esche #[derive(Default, Debug, Clone, Eq, PartialEq)] 18bca24136SVincent Esche #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] 19bca24136SVincent Esche #[cfg_attr(feature = "serde", serde(transparent))] 20bca24136SVincent Esche pub struct MediaTrackValueSequenceCapability<T> { 21bca24136SVincent Esche pub values: Vec<T>, 22bca24136SVincent Esche } 23bca24136SVincent Esche 24bca24136SVincent Esche impl<T> From<T> for MediaTrackValueSequenceCapability<T> { from(value: T) -> Self25bca24136SVincent Esche fn from(value: T) -> Self { 26bca24136SVincent Esche Self { 27bca24136SVincent Esche values: vec![value], 28bca24136SVincent Esche } 29bca24136SVincent Esche } 30bca24136SVincent Esche } 31bca24136SVincent Esche 32bca24136SVincent Esche impl<T> From<Vec<T>> for MediaTrackValueSequenceCapability<T> { from(values: Vec<T>) -> Self33bca24136SVincent Esche fn from(values: Vec<T>) -> Self { 34bca24136SVincent Esche Self { values } 35bca24136SVincent Esche } 36bca24136SVincent Esche } 37bca24136SVincent Esche 38*cebcf132SVincent Esche #[cfg(test)] 39*cebcf132SVincent Esche mod tests { 40*cebcf132SVincent Esche use super::*; 41*cebcf132SVincent Esche 42*cebcf132SVincent Esche type Subject = MediaTrackValueSequenceCapability<String>; 43*cebcf132SVincent Esche 44*cebcf132SVincent Esche #[test] default()45*cebcf132SVincent Esche fn default() { 46*cebcf132SVincent Esche let subject = Subject::default(); 47*cebcf132SVincent Esche 48*cebcf132SVincent Esche let actual = subject.values; 49*cebcf132SVincent Esche 50*cebcf132SVincent Esche let expected: Vec<String> = vec![]; 51*cebcf132SVincent Esche 52*cebcf132SVincent Esche assert_eq!(actual, expected); 53*cebcf132SVincent Esche } 54*cebcf132SVincent Esche 55*cebcf132SVincent Esche mod from { 56*cebcf132SVincent Esche use super::*; 57*cebcf132SVincent Esche 58*cebcf132SVincent Esche #[test] value()59*cebcf132SVincent Esche fn value() { 60*cebcf132SVincent Esche let subject = Subject::from("foo".to_owned()); 61*cebcf132SVincent Esche 62*cebcf132SVincent Esche let actual = subject.values; 63*cebcf132SVincent Esche 64*cebcf132SVincent Esche let expected: Vec<String> = vec!["foo".to_owned()]; 65*cebcf132SVincent Esche 66*cebcf132SVincent Esche assert_eq!(actual, expected); 67*cebcf132SVincent Esche } 68*cebcf132SVincent Esche 69*cebcf132SVincent Esche #[test] values()70*cebcf132SVincent Esche fn values() { 71*cebcf132SVincent Esche let subject = Subject::from(vec!["foo".to_owned(), "bar".to_owned()]); 72*cebcf132SVincent Esche 73*cebcf132SVincent Esche let actual = subject.values; 74*cebcf132SVincent Esche 75*cebcf132SVincent Esche let expected: Vec<String> = vec!["foo".to_owned(), "bar".to_owned()]; 76*cebcf132SVincent Esche 77*cebcf132SVincent Esche assert_eq!(actual, expected); 78*cebcf132SVincent Esche } 79*cebcf132SVincent Esche } 80*cebcf132SVincent Esche } 81*cebcf132SVincent Esche 82bca24136SVincent Esche #[cfg(feature = "serde")] 83bca24136SVincent Esche #[cfg(test)] 84bca24136SVincent Esche mod serde_tests { 85bca24136SVincent Esche use crate::macros::test_serde_symmetry; 86bca24136SVincent Esche 87bca24136SVincent Esche use super::*; 88bca24136SVincent Esche 89*cebcf132SVincent Esche type Subject = MediaTrackValueSequenceCapability<String>; 90bca24136SVincent Esche 91bca24136SVincent Esche #[test] customized()92bca24136SVincent Esche fn customized() { 93bca24136SVincent Esche let subject = Subject { 94*cebcf132SVincent Esche values: vec!["foo".to_owned(), "bar".to_owned()], 95bca24136SVincent Esche }; 96*cebcf132SVincent Esche let json = serde_json::json!(["foo", "bar"]); 97bca24136SVincent Esche 98bca24136SVincent Esche test_serde_symmetry!(subject: subject, json: json); 99bca24136SVincent Esche } 100bca24136SVincent Esche } 101