diff options
Diffstat (limited to 'src/config')
-rw-r--r-- | src/config/builder.rs | 41 | ||||
-rw-r--r-- | src/config/config.rs | 21 |
2 files changed, 42 insertions, 20 deletions
diff --git a/src/config/builder.rs b/src/config/builder.rs index 9e3cce9..3748921 100644 --- a/src/config/builder.rs +++ b/src/config/builder.rs @@ -92,21 +92,32 @@ impl<'source> AsyncConfigBuilder<'source> { Config::build_from_async_builder(self).await } - pub(crate) async fn reload(&self) -> Result<Vec<ConfigObject<'source>>, SourceError> { - use futures::stream::FuturesOrdered; - use futures::stream::StreamExt; - use futures::FutureExt; - use itertools::Itertools; + pub(crate) async fn reload(&'source self) -> Result<Vec<ConfigObject<'source>>, SourceError> { + async fn do_load<'source>(builders: &'source Vec<Box<dyn AsyncConfigSource<'source>>>) -> Result<Vec<ConfigObject<'source>>, SourceError> { + let mut v = Vec::with_capacity(builders.len()); + for cs in builders.iter() { + v.push(cs.load().await?); + } + Ok(v) + } - self.overwrites_builders - .iter() - .map(|cs| async move { cs.load().await }.boxed()) - .chain(self.layers_builders.iter().map(|cs| async move { cs.load().await }.boxed())) - .chain(self.defaults_builders.iter().map(|cs| async move { cs.load().await }.boxed())) - .collect::<FuturesOrdered<_>>() - .collect::<Vec<Result<ConfigObject<'source>, SourceError>>>() - .await - .into_iter() - .collect() + let overwrites = do_load(&self.overwrites_builders); + let layers = do_load(&self.layers_builders); + let defaults = do_load(&self.defaults_builders); + + let (mut overwrites, mut layers, mut defaults) = + futures::try_join!(overwrites, layers, defaults)?; + + let mut v = Vec::with_capacity({ + self.layers_builders.len() + + self.defaults_builders.len() + + self.overwrites_builders.len() + }); + + v.append(&mut overwrites); + v.append(&mut layers); + v.append(&mut defaults); + + Ok(v) } } diff --git a/src/config/config.rs b/src/config/config.rs index 3442acb..568b3fa 100644 --- a/src/config/config.rs +++ b/src/config/config.rs @@ -36,6 +36,7 @@ impl<'source> Config<'source> { { let mut layers = config.layers.write().unwrap(); + #[allow(irrefutable_let_patterns)] if let Builder::Sync(builder) = &config.builder { *layers = Some(builder.reload()?); } else { @@ -50,12 +51,22 @@ impl<'source> Config<'source> { pub(super) async fn build_from_async_builder( builder: AsyncConfigBuilder<'source>, ) -> Result<Config<'source>, ConfigError> { - let layers = builder.reload().await?; - - Ok(Config { - layers: RwLock::new(Some(layers)), + let config = Config { + layers: RwLock::new(None), builder: Builder::Async(builder), - }) + }; + + { + let l = match config.builder { + Builder::Sync(ref builder) => builder.reload()?, + Builder::Async(ref builder) => builder.reload().await?, + }; + + let mut layers = config.layers.write().unwrap(); + *layers = Some(l); + } + + Ok(config) } #[cfg(feature = "async")] |