projtool/src/main.rs

74 lines
1.4 KiB
Rust

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<Command>,
}
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(())
}