use clap::Parser; use figment::{ providers::{Env, Format, Serialized, Toml}, Figment, }; use std::{error::Error, fs::File, sync::Arc}; use tmuxr::{Cli, Config, Finder, Paths, Result}; use tracing::info; use tracing_subscriber::prelude::*; fn main() -> Result<()> { let cli = Cli::parse(); let config = Figment::from(Serialized::defaults(Config::default())) .merge(Serialized::defaults(&cli)) .merge(Toml::file("tmuxr.toml")) .merge(Env::prefixed("TMUXR_")) .extract() .map_err(eprintln)?; init_subscriber(&cli, &config).map_err(eprintln)?; run(&config).map_err(eprintln) } fn eprintln(err: E) -> E { eprintln!("{}", err); err } fn init_subscriber(cli: &Cli, config: &Config) -> Result<()> { let stdout_layer = tracing_subscriber::fmt::layer() .pretty() .with_filter(cli.verbose.as_filter()); let log_layer = if config.log_enabled { let file = File::create(&config.log_file)?; let log_layer = tracing_subscriber::fmt::layer().with_writer(Arc::new(file)); Some(log_layer) } else { None }; tracing_subscriber::registry() .with(stdout_layer) .with(log_layer) .init(); Ok(()) } #[tracing::instrument()] pub fn run(config: &Config) -> Result<()> { let paths = Paths::from_provider(config)?; let selected = Finder::from_provider(config)?.spawn()?.find(paths)?; info!("{:?}", selected); Ok(()) }