diff options
Diffstat (limited to 'src/config.rs')
-rw-r--r-- | src/config.rs | 159 |
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() } ); |