ezk/nodes/
config_filter.rs

1use 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}