aboutsummaryrefslogtreecommitdiffstats
path: root/src/config.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/config.rs')
-rw-r--r--src/config.rs159
1 files changed, 42 insertions, 117 deletions
diff --git a/src/config.rs b/src/config.rs
index 2c61b88..a2305f1 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -1,35 +1,27 @@
use crate::{Error, Result};
-use figment::{
- providers::{Env, Format, Serialized, Toml},
- Figment,
-};
-use ignore::WalkBuilder;
+use figment::{providers::Serialized, value, Figment, Metadata, Profile, Provider};
use serde::{Deserialize, Serialize};
-use std::{fmt::Display, fs::File, path::PathBuf, sync::Arc};
-use tracing::{info, warn};
+use std::{fs::File, path::PathBuf, sync::Arc};
use tracing_subscriber::{Layer, Registry};
-#[derive(Debug, PartialEq, Eq, Default, Serialize, Deserialize)]
+#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct Config {
- pub(crate) paths: Paths,
- pub(crate) finder: Finder,
- pub(crate) logging: Logging,
+ pub log_enabled: bool,
+ pub log_file: PathBuf,
+ pub paths: crate::directories::Config,
+ pub finder: crate::finder::Config,
}
impl Config {
- pub fn extract(self) -> Result<Config> {
- Figment::from(Serialized::defaults(self))
- .merge(Toml::file("tmuxr.toml"))
- .merge(Env::prefixed("TMUXR_"))
- .extract()
- .map_err(Error::from)
+ pub fn from<T: Provider>(provider: T) -> figment::error::Result<Config> {
+ Figment::from(provider).extract()
}
pub fn as_layer(&self) -> Result<Vec<Box<dyn Layer<Registry> + Send + Sync>>> {
let mut layers = Vec::new();
- if self.logging.enabled {
- let file = File::create(&self.logging.path)?;
+ if self.log_enabled {
+ let file = File::create(&self.log_file)?;
let log_layer = tracing_subscriber::fmt::layer()
.with_writer(Arc::new(file))
.boxed();
@@ -40,104 +32,42 @@ impl Config {
}
}
-#[derive(Debug, PartialEq, Eq, Default, Serialize, Deserialize)]
-pub(crate) struct Paths {
- pub(crate) search: Vec<PathBuf>,
- pub(crate) add: Vec<PathBuf>,
- pub(crate) hidden: bool,
-}
-
-impl Display for Paths {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- Vec::<PathBuf>::from(self)
- .into_iter()
- .filter_map(|p: PathBuf| {
- p.to_str().map(|s| s.to_owned()).or_else(|| {
- warn!("Failed to convert path to str");
- None
- })
- })
- .map(|s| writeln!(f, "{}", s))
- .collect::<std::fmt::Result>()
+impl Default for Config {
+ fn default() -> Self {
+ Self {
+ paths: Default::default(),
+ finder: Default::default(),
+ log_enabled: Default::default(),
+ log_file: dirs::cache_dir()
+ .map(|p| p.join("tmuxr"))
+ .unwrap_or_default()
+ .join("tmuxr.log"),
+ }
}
}
-impl From<&Paths> for Vec<PathBuf> {
- fn from(value: &Paths) -> Self {
- let mut dirs = value.search.to_owned().into_iter();
- let first = dirs.nth(0).unwrap_or_default();
-
- let mut path_bufs = dirs
- .fold(
- WalkBuilder::new(first)
- .standard_filters(true)
- .max_depth(Some(1)),
- |walk, dir| walk.add(dir),
- )
- .build()
- .filter_map(|res| {
- res.map_err(|err| {
- warn!("Error while walking directory: {:?}", err);
- err
- })
- .ok()
- })
- .map(|entry| entry.into_path())
- .collect::<Vec<PathBuf>>();
-
- info!("{:?}", value.add);
- info!("{:?}", path_bufs);
-
- path_bufs.extend(value.add.to_owned());
- path_bufs
+impl Provider for Config {
+ fn metadata(&self) -> Metadata {
+ Metadata::named("Tmuxr directory config")
}
-}
-
-#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
-pub(crate) struct Finder {
- pub(crate) program: String,
- pub(crate) args: Vec<String>,
-}
-impl Default for Finder {
- fn default() -> Self {
- Self {
- program: "fzf-tmux".into(),
- args: vec![
- "--",
- "--multi",
- "--print-query",
- "-d/",
- "--preview-window='right,75%,<80(up,75%,border-bottom)'",
- "--preview='sel={}; less ${sel:-{q}} 2>/dev/null'",
- ]
- .into_iter()
- .map(Into::into)
- .collect(),
- }
+ fn data(&self) -> figment::error::Result<value::Map<Profile, value::Dict>> {
+ Serialized::defaults(Config::default()).data()
}
}
-#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
-pub(crate) struct Logging {
- pub(crate) enabled: bool,
- pub(crate) path: PathBuf,
-}
+impl TryFrom<Figment> for Config {
+ type Error = Error;
-impl Default for Logging {
- fn default() -> Self {
- Self {
- enabled: Default::default(),
- path: dirs::cache_dir()
- .map(|p| p.join("tmuxr"))
- .unwrap_or_default()
- .join("tmuxr.log"),
- }
+ fn try_from(value: Figment) -> Result<Self> {
+ value.extract().map_err(Into::into)
}
}
#[cfg(test)]
mod tests {
+ use crate::{finder, directories};
+
use super::*;
use figment::providers::{Format, Serialized, Toml};
@@ -147,6 +77,8 @@ mod tests {
jail.create_file(
"tmuxr.toml",
r#"
+ log_enabled = false
+
[paths]
search = []
add = []
@@ -162,10 +94,6 @@ mod tests {
"--preview-window='right,75%,<80(up,75%,border-bottom)'",
"--preview='sel={}; less ${sel:-{q}} 2>/dev/null'",
]
-
- [logging]
- enabled = true
- path = "/tmp/tmuxr/test/tmuxr.log"
"#,
)?;
@@ -185,6 +113,9 @@ mod tests {
jail.create_file(
"tmuxr.toml",
r#"
+ log_enabled = true
+ log_file = "/tmp/tmuxr/test/tmuxr.log"
+
[paths]
search = [ "/tmp/tmuxr/test/projects" ]
add = [ "/tmp/tmuxr/test/other_projects" ]
@@ -193,10 +124,6 @@ mod tests {
[finder]
program = "fzf"
args = ["-0", "-1", "--preview='cat'"]
-
- [logging]
- enabled = true
- log_file = "/tmp/tmuxr/test/tmuxr.log"
"#,
)?;
@@ -207,19 +134,17 @@ mod tests {
assert_eq!(
config,
Config {
- paths: Paths {
+ paths: directories::Config {
search: vec!["/tmp/tmuxr/test/projects".into()],
add: vec!["/tmp/tmuxr/test/extra_project".into()],
hidden: true,
},
- finder: Finder {
+ finder: finder::Config {
program: "fzf".into(),
args: vec!["-0".into(), "-1".into(), "--preview='cat'".into()],
},
- logging: Logging {
- enabled: true,
- path: "/tmp/tmuxr/test/tmuxr.log".into()
- },
+ log_enabled: true,
+ log_file: "/tmp/tmuxr/test/tmuxr.log".into()
}
);