arch-commando 0.2.0

A fast, locate-like utility to search for commands on Arch Linux repos
use std::{env, fs::create_dir_all, path::Path, process::exit};

use argparser::Args;
use clap::Parser;
use database::{
    alpm::{extract_alpm_db, parse_alpm_db},
    cdb::{create_cdb, search_in_cdb},
};
use pacutils::{download_pacman_db, parse_pacman_conf};

mod argparser;
mod database;
mod pacutils;

fn main() {
    let args = Args::parse();

    let mut path = args.path.unwrap_or_else(|| {
        let home = match env::var("HOME") {
            Ok(h) if h.is_empty() => {
                eprintln!("[FATAL]: please ensure that your HOME environment variable is properly set and valid UTF-8 text.\nError details: HOME env var is empty");
                exit(1);
            }

            Err(e) => {
                eprintln!("[FATAL]: please ensure that your HOME environment variable is properly set and valid UTF-8 text.\nError details: {e}");
                exit(1);
            }

            Ok(h) => h,
        };


        let path = Path::new(&home);
        path.join(".local/share/commando/cdb.db")
    });

    if path.ends_with("/") {
        if !path.exists() {
            if let Err(e) = create_dir_all(&path) {
                eprintln!(
                    "[FATAL]: couldn't create dir '{}'.\nError details: {e}",
                    path.display()
                );
                exit(1);
            }
        }

        path = path.join("cdb.db")
    } else {
        let path = path.parent().unwrap_or_else(|| Path::new("/"));

        if !path.exists() {
            if let Err(e) = create_dir_all(&path) {
                eprintln!(
                    "[FATAL]: couldn't create dir '{}'.\nError details: {e}",
                    path.display()
                );
                exit(1);
            }
        }
    }

    if args.update {
        println!("Downloading pacman files database");

        let pacman_db = download_pacman_db(parse_pacman_conf());

        println!("Download completed\nReading database data");

        let data = parse_alpm_db(extract_alpm_db(pacman_db));

        println!("Writing data to commando database");

        create_cdb(data, path);

        println!("All done");
        exit(0);
    }

    let command = args.command.unwrap();

    if command.len() <= 255 {
        search_in_cdb(command, path);
    } else {
        eprintln!("[FATAL]: <COMMAND> argument's length must be lower than 256");
        exit(1);
    }
}