diff options
Diffstat (limited to 'src/config.rs')
-rw-r--r-- | src/config.rs | 76 |
1 files changed, 72 insertions, 4 deletions
diff --git a/src/config.rs b/src/config.rs index 4ba59b4..d31eca8 100644 --- a/src/config.rs +++ b/src/config.rs @@ -5,15 +5,17 @@ use std::{fs::File, path::PathBuf, sync::Arc}; use tracing_subscriber::{Layer, Registry}; #[derive(Debug, PartialEq, Eq, Serialize, Deserialize)] +#[serde(default)] pub struct Config { - pub log_enabled: bool, - pub log_file: PathBuf, + #[serde(flatten)] pub paths: crate::paths::Config, pub finder: crate::finder::Config, + pub log_enabled: bool, + pub log_file: PathBuf, } impl Config { - pub fn from<T: Provider>(provider: T) -> figment::error::Result<Config> { + pub fn extract<T: Provider>(provider: T) -> figment::error::Result<Config> { Figment::from(provider).extract() } @@ -52,7 +54,7 @@ impl Provider for Config { } fn data(&self) -> figment::error::Result<value::Map<Profile, value::Dict>> { - Serialized::defaults(Config::default()).data() + Serialized::defaults(Self::default()).data() } } @@ -63,3 +65,69 @@ impl TryFrom<Figment> for Config { value.extract().map_err(Into::into) } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::paths::PathEntry; + use figment::providers::{Format, Serialized, Toml}; + + #[test] + fn test_extract() { + figment::Jail::expect_with(|jail| { + jail.create_file( + "tmuxr.toml", + r#" + log_enabled = true + log_file = "/path/to/log_file" + paths = [ + "/path/to/projects", + { path = "/path/to/other_projects", recurse = 1, hidden = true }, + { path = "/path/to/another_project", recurse = 0 }, + ] + + [finder] + program = "fzf" + args = ["-0", "-1", "--preview='cat'"] + "#, + )?; + + let config: Config = Figment::from(Serialized::defaults(Config::default())) + .merge(Toml::file("tmuxr.toml")) + .extract()?; + + assert_eq!( + config, + Config { + paths: crate::paths::Config { + paths: Vec::from([ + PathEntry { + path: "/path/to/projects".into(), + hidden: false, + recurse: None, + }, + PathEntry { + path: "/path/to/other_projects".into(), + hidden: true, + recurse: Some(1), + }, + PathEntry { + path: "/path/to/another_project".into(), + hidden: false, + recurse: Some(0), + }, + ]), + }, + finder: crate::finder::Config { + program: "fzf".into(), + args: vec!["-0".into(), "-1".into(), "--preview='cat'".into()], + }, + log_enabled: true, + log_file: "/path/to/log_file".into() + } + ); + + Ok(()) + }); + } +} |