diff --git a/crates/factor-variables/src/spin_cli/env.rs b/crates/factor-variables/src/spin_cli/env.rs index 4e9d3cccec..ad2d51b030 100644 --- a/crates/factor-variables/src/spin_cli/env.rs +++ b/crates/factor-variables/src/spin_cli/env.rs @@ -29,7 +29,7 @@ const DEFAULT_ENV_PREFIX: &str = "SPIN_VARIABLE"; type EnvFetcherFn = Box Result + Send + Sync>; -/// A config Provider that uses environment variables. +/// A [`Provider`] that uses environment variables. pub struct EnvVariablesProvider { prefix: Option, env_fetcher: EnvFetcherFn, @@ -37,6 +37,17 @@ pub struct EnvVariablesProvider { dotenv_cache: OnceLock>, } +impl Default for EnvVariablesProvider { + fn default() -> Self { + Self { + prefix: None, + env_fetcher: Box::new(|s| std::env::var(s)), + dotenv_path: Some(".env".into()), + dotenv_cache: Default::default(), + } + } +} + impl EnvVariablesProvider { /// Creates a new EnvProvider. /// diff --git a/crates/factor-variables/src/spin_cli/mod.rs b/crates/factor-variables/src/spin_cli/mod.rs index bf21a944dc..2b6a48c481 100644 --- a/crates/factor-variables/src/spin_cli/mod.rs +++ b/crates/factor-variables/src/spin_cli/mod.rs @@ -3,25 +3,30 @@ mod env; mod statik; +pub use env::*; +pub use statik::*; + use serde::Deserialize; use spin_expressions::Provider; use spin_factors::anyhow; -use statik::StaticVariablesProvider; use crate::runtime_config::RuntimeConfig; /// Resolves a runtime configuration for the variables factor from a TOML table. -pub fn runtime_config_from_toml(table: &toml::Table) -> anyhow::Result> { +pub fn runtime_config_from_toml(table: &toml::Table) -> anyhow::Result { + // Always include the environment variable provider. + let mut providers = vec![Box::new(EnvVariablesProvider::default()) as _]; let Some(array) = table.get("variable_provider") else { - return Ok(None); + return Ok(RuntimeConfig { providers }); }; let provider_configs: Vec = array.clone().try_into()?; - let providers = provider_configs - .into_iter() - .map(VariableProviderConfiguration::into_provider) - .collect(); - Ok(Some(RuntimeConfig { providers })) + providers.extend( + provider_configs + .into_iter() + .map(VariableProviderConfiguration::into_provider), + ); + Ok(RuntimeConfig { providers }) } /// A runtime configuration used in the Spin CLI for one type of variable provider. @@ -31,7 +36,7 @@ pub enum VariableProviderConfiguration { /// A static provider of variables. Static(StaticVariablesProvider), /// An environment variable provider. - Env(env::EnvVariablesConfig), + Env(EnvVariablesConfig), } impl VariableProviderConfiguration { diff --git a/crates/factor-variables/src/spin_cli/statik.rs b/crates/factor-variables/src/spin_cli/statik.rs index 3c024eabf5..d596c3e56c 100644 --- a/crates/factor-variables/src/spin_cli/statik.rs +++ b/crates/factor-variables/src/spin_cli/statik.rs @@ -4,7 +4,7 @@ use serde::Deserialize; use spin_expressions::{async_trait::async_trait, Key, Provider}; use spin_factors::anyhow; -/// A variables provider that reads variables from an static map. +/// A [`Provider`] that reads variables from an static map. #[derive(Debug, Deserialize, Clone)] pub struct StaticVariablesProvider { values: Arc>, diff --git a/crates/factor-variables/tests/factor_test.rs b/crates/factor-variables/tests/factor_test.rs index 2e17fc96cf..1ce4030002 100644 --- a/crates/factor-variables/tests/factor_test.rs +++ b/crates/factor-variables/tests/factor_test.rs @@ -10,7 +10,7 @@ struct TestFactors { variables: VariablesFactor, } -#[tokio::test] +#[tokio::test(flavor = "multi_thread")] async fn static_provider_works() -> anyhow::Result<()> { let factors = TestFactors { variables: VariablesFactor::default(), @@ -58,7 +58,7 @@ impl FactorRuntimeConfigSource for TomlConfig { fn get_runtime_config( &mut self, ) -> anyhow::Result::RuntimeConfig>> { - spin_cli::runtime_config_from_toml(&self.table) + spin_cli::runtime_config_from_toml(&self.table).map(Some) } } diff --git a/crates/factors/tests/smoke.rs b/crates/factors/tests/smoke.rs index ec46d8489c..6beb96f50b 100644 --- a/crates/factors/tests/smoke.rs +++ b/crates/factors/tests/smoke.rs @@ -174,6 +174,7 @@ impl FactorRuntimeConfigSource for TestSource { [variable_provider.values] foo = "bar" }) + .map(Some) } }