mod cli; mod dirs; mod projects; mod tui; use anyhow::Result; use clap::Parser; use cli::Command; use projects::Projects; #[derive(Debug, Parser)] struct Args { #[command(subcommand)] pub cmd: Option, } fn main() -> Result<()> { init_tracing()?; let args = Args::parse(); let projects = Projects::read_file()?; match &args.cmd { Some(cmd) => cmd.execute(projects)?, None => tui::run(projects)?, }; Ok(()) } fn init_tracing() -> Result<()> { use std::fs; use tracing::Level; use tracing_appender::rolling; use tracing_subscriber::filter::Targets; use tracing_subscriber::layer::SubscriberExt; use tracing_subscriber::util::SubscriberInitExt; let level = if cfg!(debug_assertions) { Level::TRACE } else { Level::INFO }; let log_path = dirs::state_path().join("logs"); if !fs::exists(&log_path)? { fs::create_dir_all(&log_path)?; } let filter_layer = Targets::new() .with_target(env!("CARGO_PKG_NAME"), level) .with_default(Level::ERROR); let appender = rolling::daily(&log_path, "app"); let fmt_layer = tracing_subscriber::fmt::layer() .with_writer(appender) .with_ansi(false); tracing_subscriber::registry() .with(fmt_layer) .with(filter_layer) .try_init()?; Ok(()) }