webrtc_constraints/
setting.rs

1#[cfg(feature = "serde")]
2use 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))]
17pub 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
28impl std::fmt::Display for MediaTrackSetting {
29    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
39impl From<bool> for MediaTrackSetting {
40    fn from(setting: bool) -> Self {
41        Self::Bool(setting)
42    }
43}
44
45impl From<i64> for MediaTrackSetting {
46    fn from(setting: i64) -> Self {
47        Self::Integer(setting)
48    }
49}
50
51impl From<f64> for MediaTrackSetting {
52    fn from(setting: f64) -> Self {
53        Self::Float(setting)
54    }
55}
56
57impl From<String> for MediaTrackSetting {
58    fn from(setting: String) -> Self {
59        Self::String(setting)
60    }
61}
62
63impl<'a> From<&'a str> for MediaTrackSetting {
64    fn from(setting: &'a str) -> Self {
65        Self::String(setting.to_owned())
66    }
67}
68
69#[cfg(test)]
70mod tests {
71    use super::*;
72
73    type Subject = MediaTrackSetting;
74
75    mod from {
76        use super::*;
77
78        #[test]
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]
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]
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]
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]
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)]
122mod serde_tests {
123    use crate::macros::test_serde_symmetry;
124
125    use super::*;
126
127    type Subject = MediaTrackSetting;
128
129    #[test]
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]
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]
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]
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}