webrtc_constraints/constraints/
stream.rs1#[cfg(feature = "serde")]
2use serde::{Deserialize, Serialize};
3
4use crate::MediaTrackConstraint;
5
6use super::track::GenericBoolOrMediaTrackConstraints;
7
8pub type MediaStreamConstraints = GenericMediaStreamConstraints<MediaTrackConstraint>;
19
20#[derive(Debug, Clone, Default, Eq, PartialEq)]
31#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
32#[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))]
33pub struct GenericMediaStreamConstraints<T> {
34 #[cfg_attr(feature = "serde", serde(default))]
35 pub audio: GenericBoolOrMediaTrackConstraints<T>,
36 #[cfg_attr(feature = "serde", serde(default))]
37 pub video: GenericBoolOrMediaTrackConstraints<T>,
38}
39
40#[cfg(feature = "serde")]
41#[cfg(test)]
42mod tests {
43 use std::iter::FromIterator;
44
45 use crate::{
46 constraints::{
47 advanced::AdvancedMediaTrackConstraints,
48 mandatory::MandatoryMediaTrackConstraints,
49 track::{BoolOrMediaTrackConstraints, MediaTrackConstraints},
50 },
51 macros::test_serde_symmetry,
52 property::all::name::*,
53 MediaTrackConstraintSet,
54 };
55
56 use super::*;
57
58 type Subject = MediaStreamConstraints;
59
60 #[test]
61 fn default() {
62 let subject = Subject::default();
63 let json = serde_json::json!({
64 "audio": false,
65 "video": false,
66 });
67 test_serde_symmetry!(subject: subject, json: json);
68 }
69
70 #[test]
71 fn customized() {
72 let subject = Subject {
73 audio: BoolOrMediaTrackConstraints::Constraints(MediaTrackConstraints {
74 mandatory: MandatoryMediaTrackConstraints::from_iter([
75 (&DEVICE_ID, "microphone".into()),
76 (&CHANNEL_COUNT, 2.into()),
77 ]),
78 advanced: AdvancedMediaTrackConstraints::new(vec![
79 MediaTrackConstraintSet::from_iter([(&LATENCY, 0.123.into())]),
80 ]),
81 }),
82 video: BoolOrMediaTrackConstraints::Bool(true),
83 };
84 let json = serde_json::json!({
85 "audio": {
86 "deviceId": "microphone",
87 "channelCount": 2_i64,
88 "advanced": [
89 { "latency": 0.123_f64, }
90 ]
91 },
92 "video": true,
93 });
94 test_serde_symmetry!(subject: subject, json: json);
95 }
96}