use dott::{prelude::*, sync_dirs};
use clap::{Args, Parser, Subcommand};
use directories::BaseDirs;
use std::path::PathBuf;
fn get_home_dir() -> Result<PathBuf> {
let Some(base_dir) = BaseDirs::new() else {
return Err(DottError::Generic("No valid path could be retrieved from system".into()))
};
Ok(base_dir.home_dir().to_owned())
}
fn main() -> Result<()> {
let cwd = std::env::current_dir()?;
let cli = Cli::parse();
match &cli.command {
Commands::Install(args) => {
let source = &cwd;
let patterns_file = &cwd.join("dott.config");
let target = get_home_dir()?;
let raw = &args.raw;
let skip_prompt = &args.skip_prompt;
println!("Will use patterns from {}", patterns_file.display());
println!("To gather files from {}", source.display());
println!("And sync them to {}", target.display());
println!();
if let Err(e) = sync_dirs(patterns_file, source, &target, raw, skip_prompt) {
eprintln!("{}", e);
std::process::exit(1);
}
}
Commands::Refresh(args) => {
let target = &cwd;
let patterns_file = &cwd.join("dott.config");
let source = get_home_dir()?;
let raw = &args.raw;
let skip_prompt = &args.skip_prompt;
println!("Will use patterns from {}", patterns_file.display());
println!("To gather files from {}", source.display());
println!("And sync them to {}", target.display());
println!();
if let Err(e) = sync_dirs(patterns_file, &source, target, raw, skip_prompt) {
eprintln!("{}", e);
std::process::exit(1);
}
}
};
Ok(())
}
#[derive(Parser)]
#[command(author, version, about, long_about = None)]
#[command(propagate_version = true)]
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
}
#[derive(Subcommand)]
pub enum Commands {
Refresh(SyncArgs),
Install(SyncArgs),
}
#[derive(Args)]
pub struct SyncArgs {
#[arg(short, long, default_value_t = false)]
pub raw: bool,
#[arg(short = 'y', default_value_t = false)]
pub skip_prompt: bool,
}
#[derive(Args)]
pub struct InstallArgs {
#[arg(short, long)]
pub force: bool,
}