xref: /webrtc/interceptor/src/registry.rs (revision ffe74184)
1 use crate::chain::Chain;
2 use crate::error::Result;
3 use crate::noop::NoOp;
4 use crate::{Interceptor, InterceptorBuilder};
5 
6 use std::sync::Arc;
7 
8 /// Registry is a collector for interceptors.
9 #[derive(Default)]
10 pub struct Registry {
11     builders: Vec<Box<dyn InterceptorBuilder + Send + Sync>>,
12 }
13 
14 impl Registry {
new() -> Self15     pub fn new() -> Self {
16         Registry { builders: vec![] }
17     }
18 
19     /// add adds a new InterceptorBuilder to the registry.
add(&mut self, builder: Box<dyn InterceptorBuilder + Send + Sync>)20     pub fn add(&mut self, builder: Box<dyn InterceptorBuilder + Send + Sync>) {
21         self.builders.push(builder);
22     }
23 
24     /// build constructs a single Interceptor from an InterceptorRegistry
build(&self, id: &str) -> Result<Arc<dyn Interceptor + Send + Sync>>25     pub fn build(&self, id: &str) -> Result<Arc<dyn Interceptor + Send + Sync>> {
26         if self.builders.is_empty() {
27             return Ok(Arc::new(NoOp {}));
28         }
29 
30         self.build_chain(id)
31             .map(|c| Arc::new(c) as Arc<dyn Interceptor + Send + Sync>)
32     }
33 
34     /// build_chain constructs a non-type erased Chain from an Interceptor registry.
build_chain(&self, id: &str) -> Result<Chain>35     pub fn build_chain(&self, id: &str) -> Result<Chain> {
36         if self.builders.is_empty() {
37             return Ok(Chain::new(vec![Arc::new(NoOp {})]));
38         }
39 
40         let interceptors: Result<Vec<_>> = self.builders.iter().map(|b| b.build(id)).collect();
41 
42         Ok(Chain::new(interceptors?))
43     }
44 }
45