mod common; mod config; mod refractr; use clap::Parser; use std::path::PathBuf; use std::process; use users; #[derive(Parser)] #[command(name = "refractor")] #[command(version = "0.1.0")] #[command(about = "An automated push/pull/clone utility for mirroring Git repositories")] #[command(long_about = None)] struct Args { #[arg(short, long, help = "Specify a config file", default_value = get_config_default())] config: Vec, #[arg(short, long, help = "Specify the level of verbosity", action = clap::ArgAction::Count)] verbose: u8, #[arg(short = 'e', long, help = "Output a full, commented config file and exit")] create: bool, } fn get_config_default() -> &'static str { if cfg!(windows) { "C:\\ProgramData\\refractr\\config.toml" } else { "/etc/refractr/config.toml" } } fn main() -> std::io::Result<()> { let args = Args::parse(); let refractr = common::Refractr { verbose: args.verbose, pid: process::id(), unix: cfg!(unix) }; common::verbose(refractr.verbose, 1, format!("Level {} verbosity enabled", refractr.verbose.to_string())); common::verbose(refractr.verbose, 2, format!("Checking for create flag")); if args.create { common::verbose(refractr.verbose, 3, format!("Printing sample config")); let example = include_str!("example/config.toml"); println!("{}", example); } else { // warn to avoid root/admin if refractr.unix { if users::get_current_uid() == 0 { eprintln!("refractr: warning: this program should not ran as root") } } else { // TODO: print message for Windows } let cfgs = config::read_config(args.config, &refractr); if refractr.verbose >= 2 { // no need to loop over configs if verbose is not at the correct level for i in cfgs { common::verbose(refractr.verbose, 2, format!("{}", i)); } } common::verbose(refractr.verbose, 1, format!("Config file(s) read successfully")); } Ok(()) }