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