pub mod commands;
use libginst::{
types::Programable,
program,
program::Program,
executor,
parser
};
use commands::Command;
use clap::Parser;
use std::env;
use std::error::Error;
#[derive(Parser)]
#[command(author, version, about, long_about = None)]
pub struct Arguments {
#[command(subcommand)]
command: Option<Command>,
file: String,
#[arg(short, long, group = "cli")]
interactive: bool,
#[arg(long, group = "cli")]
count: bool,
#[arg(long, group = "cli")]
count_missing: bool,
#[arg(long, group = "cli")]
check: bool,
#[arg(long, group = "cli")]
list: bool,
#[arg(long, group = "cli")]
status: bool,
#[arg(value_enum)]
shell: Option<String>,
}
fn main() -> Result<(), Box<dyn Error>> {
if cfg!(debug_assertions) {
env::set_var("RUST_BACKTRACE", "1");
}
let args = Arguments::parse();
let shell = executor::eval_shell(args.shell);
env::set_var("EXECUTE_SHELL", shell);
let file = &args.file;
let programs: Vec<Program> = parser::get_programs_from_file(file);
if args.count {
println!("{}", program::count(&programs));
} else if args.count_missing {
println!("{}", program::count_missing(&programs));
} else if args.check {
println!("File looks good!");
} else if args.list {
program::print_name(&programs);
} else if args.status {
program::print_status(&programs);
} else if let Some(command) = args.command {
match &command {
Command::Install { all, program } => {
if *all {
program::install_all(&programs);
} else if let Some(program_name) = program {
if let Some(prog) = program::search_from_name(program_name, &programs){
prog.install();
} else {
println!("No program with name {} found", program_name);
}
} else {
panic!("No option on install");
}
}
Command::Configure { all, program } => {
if *all {
program::configure_all(&programs);
} else if let Some(program_name) = program {
if let Some(prog) = program::search_from_name(program_name, &programs){
prog.configure();
} else {
println!("No program with name {} found", program_name);
}
} else {
panic!("No option on configure");
}
}
}
} else {
println!("Please specify what to do.");
println!("See `ginst --help` for help.");
}
Ok(())
}