use clap::{Parser, Subcommand}; use modlist::{ config::Cfg, db::{config_get_current_list, lists_get, lists_get_all_ids}, download, export, get_current_list, import, list_add, list_change, list_remove, list_version, mod_add, mod_remove, update, IDSelector, List, Modloader, VersionLevel, }; //TODO make default list optional #[derive(Parser)] #[command(author, version, about)] struct Cli { #[command(subcommand)] command: Commands, /// config file path #[arg(short, long)] config: Option, /// Force GameVersion update #[arg(long)] force_gameupdate: bool, } #[derive(Subcommand)] enum Commands { r#Mod { #[command(subcommand)] command: ModCommands, }, List { #[command(subcommand)] command: ListCommands, }, Download { /// download all lists #[arg(short, long)] all: bool, /// clean all mods before downloading them #[arg(short, long)] clean: bool, /// remove disabled versions #[arg(short, long)] remove: bool, /// optional List selection, else default list will be used #[arg(short, long)] list: Option, }, Update { /// download all lists #[arg(short, long)] all: bool, /// directly download updated mods #[arg(short, long)] download: bool, /// clean all mods before downloading them #[arg(short, long)] clean: bool, /// delete disabled versions #[arg(short, long)] remove: bool, /// optional List selection, else default list will be used #[arg(short, long)] list: Option, }, Import { #[arg(short, long)] file: Option, /// directly download imported mods #[arg(short, long)] download: bool, }, Export { /// the list you want to export list: Option, }, Test } #[derive(Subcommand)] enum ModCommands { Add { /// id of the mod/version id: String, /// set id mode to version #[arg(short, long)] version: bool, /// directly download the mod #[arg(short, long)] download: bool, /// lock the version added #[arg(/* short , */long)] lock: bool, /// optional List selection, else default list will be used #[arg(short, long)] list: Option, }, Remove { /// id, name or title of the mod id: String, /// optional List selection, else default list will be used #[arg(short, long)] list: Option, }, } #[derive(Subcommand)] enum ListCommands { Add { /// list id id: String, directory: String, modloader: Option, version: Option, }, Remove { /// id, name or title of the list id: String, }, List, Change { /// id of the list to change to id: String, }, Version { /// list id id: String, /// desired minecraft version version: String, /// directly download updated mods #[arg(long, short)] download: bool, /// delete disabled versions #[arg(short, long)] remove: bool, }, } #[tokio::main] async fn main() { let cli = Cli::parse(); let config = Cfg::init(cli.config).await.unwrap(); match cli.command { Commands::Mod { command } => { match command { #[allow(unused_variables)] ModCommands::Add { id, version, list, download, lock, } => { let listf = match list { Some(list) => lists_get(config.clone(), list).unwrap(), None => lists_get( config.clone(), config_get_current_list(config.clone()).unwrap(), ) .unwrap(), }; let marked_id = match version { true => IDSelector::VersionID(id), false => IDSelector::ModificationID(id), }; mod_add(config, vec![marked_id], listf, download, lock).await } ModCommands::Remove { id, list } => { let listf = match list { Some(list) => lists_get(config.clone(), list).unwrap(), None => lists_get( config.clone(), config_get_current_list(config.clone()).unwrap(), ) .unwrap(), }; mod_remove(config, &id, listf) } } } Commands::List { command } => { match command { ListCommands::Add { id, directory, modloader, version, } => { let ml = match modloader { Some(ml) => Modloader::from(&ml).unwrap(), None => config.clone().defaults.modloader, }; let versions_path = &config.versions; let ver = match version { Some(ver) => VersionLevel::from(&ver).get(versions_path, cli.force_gameupdate).await.unwrap(), None => config.clone().defaults.version.get(versions_path, cli.force_gameupdate).await.unwrap(), }; list_add(config, id, ver, ml, directory) } ListCommands::Remove { id } => list_remove(config, id), ListCommands::List => { todo!() } ListCommands::Change { id } => list_change(config, id), ListCommands::Version { id, version, download, remove, } => list_version(config, id, version, download, remove).await, } } Commands::Update { all, download, clean, remove, list } => { let mut liststack: Vec = vec![]; if all { let list_ids = lists_get_all_ids(config.clone()).unwrap(); for id in list_ids { liststack.push(lists_get(config.clone(), id).unwrap()); } } else { let current = match list { Some(l) => lists_get(config.clone(), l).unwrap(), None => get_current_list(config.clone()).unwrap(), }; liststack.push(current) } update(config, liststack, clean, download, remove).await } Commands::Download { all, clean, remove, list } => { let mut liststack: Vec = vec![]; if all { let list_ids = lists_get_all_ids(config.clone()).unwrap(); for id in list_ids { liststack.push(lists_get(config.clone(), id).unwrap()); } } else { let current = match list { Some(l) => lists_get(config.clone(), l).unwrap(), None => get_current_list(config.clone()).unwrap(), }; liststack.push(current) } download(config, liststack, clean, remove).await }, Commands::Import { file, download } => { let filestr: String = match file { Some(args) => args, None => dirs::home_dir() .unwrap() .join("mlexport.toml") .into_os_string() .into_string() .unwrap(), }; import(config, filestr, download).await } Commands::Export { list } => export(config, list), Commands::Test => Ok(()), } .unwrap(); }