74 lines
1.4 KiB
Rust
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(())
|
|
}
|