use clap::{Parser, Subcommand};
use console::style;
use std::path::PathBuf;
pub const VERSION_NUMBER: &str = env!("CARGO_PKG_VERSION");
pub const AUTHOR: &str = env!("CARGO_PKG_AUTHORS");
pub const BANNER: &str = r#"
________ __ _____
\______ \ _____/ |_ / \ ____
| | \ / _ \ __\/ \ / \_/ __ \
| ` ( <_> ) | / Y \ ___/
/_______ /\____/|__| \____|__ /\___ >
\/ \/ \/"#;
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
pub struct Arguments {
#[clap(long, env, default_value_t = false)]
pub debug: bool,
#[clap(long, default_value_t = false)]
pub disable_banner: bool,
#[clap(short, long, env)]
pub config: Option<PathBuf>,
#[clap(subcommand)]
pub commands: Option<ArgumentCommands>,
}
#[derive(Subcommand, Debug)]
pub enum ArgumentCommands {
Init,
Add {
source: String,
#[clap(short, long)]
target: Option<PathBuf>,
#[clap(short, long)]
path: Option<PathBuf>,
#[clap(short, long, value_delimiter = ',')]
folders: Option<Vec<String>>,
#[clap(long, default_value_t = false)]
dry_run: bool,
},
Update {
#[clap(long, default_value_t = false)]
dry_run: bool,
},
Status,
Remove {
source: Option<String>,
},
List,
}
pub fn init() -> Arguments {
let arguments = Arguments::parse();
let log_level = match &arguments.debug {
false => log::LevelFilter::Info,
true => log::LevelFilter::Debug,
};
env_logger::builder()
.parse_default_env()
.filter_level(log_level)
.init();
if !arguments.disable_banner {
println!(
"{} {} - v{}",
style(BANNER).green(),
style(AUTHOR).red(),
style(VERSION_NUMBER).blue()
);
}
arguments
}