aboutsummaryrefslogtreecommitdiffstats
path: root/src/config.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/config.rs')
-rw-r--r--src/config.rs76
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(())
+ });
+ }
+}