diff options
Diffstat (limited to 'src/config.rs')
-rw-r--r-- | src/config.rs | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/config.rs b/src/config.rs index 850d217..2e8f3ba 100644 --- a/src/config.rs +++ b/src/config.rs @@ -26,21 +26,31 @@ use anyhow::Context as _; /// The configuration for nitrocli, usually read from configuration /// files and environment variables. -#[derive(Clone, Copy, Debug, Default, PartialEq, serde::Deserialize)] +#[derive(Clone, Copy, Debug, Default, PartialEq, merge::Merge, serde::Deserialize)] pub struct Config { /// The model to connect to. pub model: Option<args::DeviceModel>, /// Whether to bypass the cache for all secrets or not. + #[merge(strategy = merge::bool::overwrite_false)] #[serde(default)] pub no_cache: bool, /// The log level. + #[merge(strategy = merge::num::overwrite_zero)] #[serde(default)] pub verbosity: u8, } impl Config { pub fn load() -> anyhow::Result<Self> { - load_user_config().map(|o| o.unwrap_or_default()) + use merge::Merge as _; + + let mut config = Config::default(); + if let Some(user_config) = load_user_config()? { + config.merge(user_config); + } + config.merge(load_env_config()?); + + Ok(config) } pub fn update(&mut self, args: &args::Args) { @@ -62,6 +72,12 @@ fn load_user_config() -> anyhow::Result<Option<Config>> { } } +fn load_env_config() -> anyhow::Result<Config> { + envy::prefixed("NITROCLI_") + .from_env() + .context("Failed to parse environment variables") +} + pub fn read_config_file(path: &path::Path) -> anyhow::Result<Config> { let s = fs::read_to_string(path) .with_context(|| format!("Failed to read configuration file '{}'", path.display()))?; |