summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2022-08-01 10:44:20 +0200
committerMatthias Beyer <mail@beyermatthias.de>2022-08-01 10:44:20 +0200
commit347e8f32c06baae732c97f9bb98cc05f5dab460d (patch)
tree287f82e2027722d4c4765a8b2b2f271c856ac4cf
parent77f3c55117e0f8c7b857c922f2d5f0560aff9369 (diff)
fixup! WIP: Rewrite to store loaders _and_ loaded configrethink
-rw-r--r--src/config/builder.rs41
-rw-r--r--src/config/config.rs21
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")]