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