use std::io::{Error, ErrorKind}; use crate::{db::{lists_insert, lists_remove, config_change_current_list, lists_get_all_ids, config_get_current_list, lists_get, lists_version}, Modloader, config::Cfg, input::{Input, Subcmd}, cmd_update, error::{MLE, ErrorType, MLError}}; #[derive(Debug, Clone, PartialEq, Eq)] pub struct List { pub id: String, pub mc_version: String, pub modloader: Modloader, pub download_folder: String, } pub async fn list(config: Cfg, input: Input) -> Result<(), Box> { match input.subcommand.ok_or("")? { Subcmd::Add => { match add(config, input.args.ok_or("")?) { Ok(..) => Ok(()), Err(e) => Err(Box::new(e)) } }, Subcmd::Change => { change(config, input.args) }, Subcmd::Remove => { remove(config, input.args.ok_or("")?) }, Subcmd::Version => { match version(config, input.args.ok_or("NO_VERSION")?).await { Ok(..) => Ok(()), Err(e) => Err(Box::new(e)) } } _ => { Err(Box::new(Error::new(ErrorKind::InvalidInput, "WRONG_SUBCOMMAND"))) } } } pub fn get_current_list(config: Cfg) -> MLE { let id = config_get_current_list(config.clone())?; lists_get(config, id) } fn add(config: Cfg, args: Vec) -> MLE<()> { match args.len() { 1 | 2 | 3 => Err(MLError::new(ErrorType::ArgumentCountError, "TOO_FEW_ARGUMENTS")), 4 => { let id = String::from(&args[0]); let mc_version = String::from(&args[1]); let mod_loader = Modloader::from(&args[2])?; let download_folder = String::from(&args[3]); lists_insert(config, id, mc_version, mod_loader, download_folder) }, 5.. => Err(MLError::new(ErrorType::ArgumentCountError, "TOO_MANY_ARGUMENTS")), _ => panic!("list arguments should never be zero or lower"), } } fn change(config: Cfg, args: Option>) -> Result<(), Box> { let lists = lists_get_all_ids(config.clone())?; if args.is_none() { println!("Currently selected list: {}", get_current_list(config)?.id); return Ok(()) }; let argsvec = args.ok_or("BAH")?; match argsvec.len() { 1 => { let list = String::from(&argsvec[0]); if !lists.contains(&list) { return Err(Box::new(Error::new(ErrorKind::NotFound, "LIST_DOESNT_EXIST"))); }; config_change_current_list(config, list) }, 2.. => Err(Box::new(Error::new(ErrorKind::InvalidInput, "TOO_MANY_ARGUMENTS"))), _ => panic!("list arguments should never lower than zero"), } } fn remove(config: Cfg, args: Vec) -> Result<(), Box> { match args.len() { 1 => lists_remove(config, String::from(&args[0])), 2.. => Err(Box::new(Error::new(ErrorKind::InvalidInput, "TOO_MANY_ARGUMENTS"))), _ => panic!("list arguments should never be zero or lower"), } } ///Changing the current lists version and updating it /// #Arguments /// /// * `config` - The current config /// * `args` - All args, to extract the new version async fn version(config: Cfg, args: Vec) -> MLE<()> { let current_list = lists_get(config.clone(), config_get_current_list(config.clone())?)?; lists_version(config.clone(), String::from(¤t_list.id), String::from(&args[0]))?; //update the list & with -- args cmd_update(config, vec![current_list], true, true, false).await }