tapes-v2 0.1.1-beta

Swap your whole rice in one command. Eject it with one more. Atomic dotfiles switching for Linux.
mod cli;
pub mod state;
pub mod toml;
pub mod util;
pub mod hooks;

use clap::Parser;
use cli::structs::Cli;
use log::{info, LevelFilter};

use cli::{insert, show, status, install, eject, structs::Commands};
use state::AppState;
use util::get_tapes_data_path;

fn main() -> Result<(), anyhow::Error> {
    let cli = Cli::parse();

    let state_path = get_tapes_data_path()?.join("state.json");
    let mut app = AppState::load(state_path)?;

    init_logging(cli.logging);
    info!("Tapes v2 startup");

    match cli.command {
        Commands::Show { name } => show::run(name)?,
        Commands::Insert {
            name,
            path,
            dry_run,
            no_hooks,
        } => insert::run(&mut app, name, path, dry_run, no_hooks, cli.quiet)?,
        Commands::Status => status::show(app, cli.verbose)?,
        Commands::Eject { dry_run, no_hooks } => eject::run(&mut app, dry_run, no_hooks, cli.quiet)?,
      
        Commands::Install { source, name, branch } => {
            install::run(&source, name.as_deref(), branch.as_deref())?
        }
        _ => todo!(),
    }

    Ok(())
}

fn init_logging(logging: bool) {
    let mut builder = env_logger::Builder::new();

    if let Ok(rust_log_env) = std::env::var("RUST_LOG") {
        builder.parse_filters(&rust_log_env);
    } else {
        let filter_level = if logging {
            LevelFilter::Trace
        } else {
            LevelFilter::Warn
        };

        builder.filter_level(filter_level);
    };

    builder.init();
}