ezk/nodes/
config_filter.rs1use crate::{ConfigRange, MediaType, NextEventIsCancelSafe, Result, Source, SourceEvent};
2
3pub struct ConfigFilter<S: Source> {
4 source: S,
5
6 filter: Vec<<S::MediaType as MediaType>::ConfigRange>,
7}
8
9impl<S: Source + NextEventIsCancelSafe> NextEventIsCancelSafe for ConfigFilter<S> {}
10
11impl<S: Source> ConfigFilter<S> {
12 pub fn new(source: S, filter: Vec<<S::MediaType as MediaType>::ConfigRange>) -> Self {
13 Self { source, filter }
14 }
15}
16
17impl<S: Source> Source for ConfigFilter<S> {
18 type MediaType = S::MediaType;
19
20 async fn capabilities(&mut self) -> Result<Vec<<Self::MediaType as MediaType>::ConfigRange>> {
21 self.source.capabilities().await
22 }
23
24 async fn negotiate_config(
25 &mut self,
26 available: Vec<<Self::MediaType as MediaType>::ConfigRange>,
27 ) -> Result<<Self::MediaType as MediaType>::Config> {
28 let mut new_configs = vec![];
29
30 for config in available {
31 for allowed_config in &self.filter {
32 if let Some(config) = config.intersect(allowed_config) {
33 new_configs.push(config);
34 }
35 }
36 }
37
38 self.source.negotiate_config(new_configs).await
39 }
40
41 async fn next_event(&mut self) -> Result<SourceEvent<Self::MediaType>> {
42 self.source.next_event().await
43 }
44}