diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2022-08-01 10:44:20 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2022-08-01 10:44:20 +0200 |
commit | 347e8f32c06baae732c97f9bb98cc05f5dab460d (patch) | |
tree | 287f82e2027722d4c4765a8b2b2f271c856ac4cf | |
parent | 77f3c55117e0f8c7b857c922f2d5f0560aff9369 (diff) |
fixup! WIP: Rewrite to store loaders _and_ loaded configrethink
-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")] |