diff options
author | fxqnlr <[email protected]> | 2023-01-26 17:23:06 +0100 |
---|---|---|
committer | fxqnlr <[email protected]> | 2023-01-26 17:23:06 +0100 |
commit | 57ab6addda10a49c18dc09208dfb319c0205e869 (patch) | |
tree | eec6fd465a113d15c819c64a94bc04d425f0e842 | |
parent | 1890d59428dfcca861ea1b7820411d80cc60d713 (diff) | |
download | modlist-57ab6addda10a49c18dc09208dfb319c0205e869.tar modlist-57ab6addda10a49c18dc09208dfb319c0205e869.tar.gz modlist-57ab6addda10a49c18dc09208dfb319c0205e869.zip |
Todos; fixed input with "-"
-rw-r--r-- | src/commands/modification.rs | 4 | ||||
-rw-r--r-- | src/commands/update.rs | 3 | ||||
-rw-r--r-- | src/files.rs | 1 | ||||
-rw-r--r-- | src/input.rs | 51 | ||||
-rw-r--r-- | src/main.rs | 4 |
5 files changed, 41 insertions, 22 deletions
diff --git a/src/commands/modification.rs b/src/commands/modification.rs index 6a03b35..c194202 100644 --- a/src/commands/modification.rs +++ b/src/commands/modification.rs | |||
@@ -20,6 +20,7 @@ async fn add(config: Cfg, input: Input) -> MLE<()> { | |||
20 | 20 | ||
21 | pub async fn mod_add(config: Cfg, mod_id: Vec<String>, list: List, disable_download: bool) -> MLE<()> { | 21 | pub async fn mod_add(config: Cfg, mod_id: Vec<String>, list: List, disable_download: bool) -> MLE<()> { |
22 | 22 | ||
23 | //Fix printing (its horrible) | ||
23 | println!("Adding mod(s) {:?}", mod_id); | 24 | println!("Adding mod(s) {:?}", mod_id); |
24 | let projects = if mod_id.len() == 1 { | 25 | let projects = if mod_id.len() == 1 { |
25 | vec![project(String::from(&config.apis.modrinth), &mod_id[0]).await] | 26 | vec![project(String::from(&config.apis.modrinth), &mod_id[0]).await] |
@@ -87,7 +88,8 @@ pub async fn mod_add(config: Cfg, mod_id: Vec<String>, list: List, disable_downl | |||
87 | } | 88 | } |
88 | 89 | ||
89 | fn remove(config: Cfg, input: Input) -> MLE<()> { | 90 | fn remove(config: Cfg, input: Input) -> MLE<()> { |
90 | 91 | ||
92 | //TODO inplement deletion by slug or title | ||
91 | let mod_id = mods_get_id(config.clone(), input.clone().mod_id.unwrap())?; | 93 | let mod_id = mods_get_id(config.clone(), input.clone().mod_id.unwrap())?; |
92 | 94 | ||
93 | let version = userlist_get_current_version(config.clone(), input.clone().list.unwrap().id, String::from(&mod_id))?; | 95 | let version = userlist_get_current_version(config.clone(), input.clone().list.unwrap().id, String::from(&mod_id))?; |
diff --git a/src/commands/update.rs b/src/commands/update.rs index f8bdb82..f71f537 100644 --- a/src/commands/update.rs +++ b/src/commands/update.rs | |||
@@ -139,6 +139,7 @@ async fn download_updates_test() { | |||
139 | 139 | ||
140 | use crate::{modrinth::{Version, VersionFile, Hash, VersionType}, Modloader, List}; | 140 | use crate::{modrinth::{Version, VersionFile, Hash, VersionType}, Modloader, List}; |
141 | 141 | ||
142 | let config = Cfg::init("modlist.toml").unwrap(); | ||
142 | let current_list = List { id: String::from("..."), mc_version: String::from("..."), modloader: Modloader::Forge, download_folder: String::from("./dl") }; | 143 | let current_list = List { id: String::from("..."), mc_version: String::from("..."), modloader: Modloader::Forge, download_folder: String::from("./dl") }; |
143 | 144 | ||
144 | let versions = vec![Version { | 145 | let versions = vec![Version { |
@@ -171,5 +172,5 @@ async fn download_updates_test() { | |||
171 | "fabric".to_string() | 172 | "fabric".to_string() |
172 | ] | 173 | ] |
173 | }]; | 174 | }]; |
174 | assert!(download_versions(current_list, versions).await.is_ok()) | 175 | assert!(download_versions(current_list, config, versions).await.is_ok()) |
175 | } | 176 | } |
diff --git a/src/files.rs b/src/files.rs index 0d7dc0a..ecb6e3e 100644 --- a/src/files.rs +++ b/src/files.rs | |||
@@ -11,7 +11,6 @@ pub async fn download_versions(list: List, config: Cfg, versions: Vec<Version>) | |||
11 | println!("Download to directory from: {} ({})", list.id, dl_path); | 11 | println!("Download to directory from: {} ({})", list.id, dl_path); |
12 | 12 | ||
13 | for ver in versions { | 13 | for ver in versions { |
14 | //TODO get project name instead of projectid from db | ||
15 | let project_name = mods_get_name(config.clone(), &ver.project_id)?; | 14 | let project_name = mods_get_name(config.clone(), &ver.project_id)?; |
16 | print!("\t({})Download version {}", project_name, ver.id); | 15 | print!("\t({})Download version {}", project_name, ver.id); |
17 | std::io::stdout().flush().unwrap(); | 16 | std::io::stdout().flush().unwrap(); |
diff --git a/src/input.rs b/src/input.rs index a41f671..144f22a 100644 --- a/src/input.rs +++ b/src/input.rs | |||
@@ -1,4 +1,4 @@ | |||
1 | use crate::{error::{MLE, MLError, ErrorType}, Modloader, config::Cfg, db::lists_get, get_current_list, List}; | 1 | use crate::{error::{MLE, MLError, ErrorType}, Modloader, config::Cfg, db::lists_get, get_current_list, List, modrinth::{get_minecraft_version, MCVersionType}}; |
2 | 2 | ||
3 | #[derive(Debug, Clone, PartialEq, Eq)] | 3 | #[derive(Debug, Clone, PartialEq, Eq)] |
4 | pub struct Input { | 4 | pub struct Input { |
@@ -54,10 +54,8 @@ pub enum IoOptions { | |||
54 | impl Input { | 54 | impl Input { |
55 | fn from(config: Cfg, input: Vec<String>) -> MLE<Self> { | 55 | fn from(config: Cfg, input: Vec<String>) -> MLE<Self> { |
56 | let input_string = input.join(" "); | 56 | let input_string = input.join(" "); |
57 | let mut args: Vec<&str> = input_string.split('-').collect(); | 57 | let mut args: Vec<&str> = input_string.split(" -").collect(); |
58 | args.reverse(); | 58 | args[0] = args[0].split_at(1).1; |
59 | args.pop(); | ||
60 | args.reverse(); | ||
61 | 59 | ||
62 | let mut command: Option<Cmd> = None; | 60 | let mut command: Option<Cmd> = None; |
63 | 61 | ||
@@ -95,6 +93,8 @@ impl Input { | |||
95 | mod_options = Some(ModOptions::Add); | 93 | mod_options = Some(ModOptions::Add); |
96 | if arg_split.len() == 2 { | 94 | if arg_split.len() == 2 { |
97 | mod_id = Some(String::from(arg_split[1])); | 95 | mod_id = Some(String::from(arg_split[1])); |
96 | } else { | ||
97 | return Err(MLError::new(ErrorType::ArgumentError, "Please specify a list mod slug or id")); | ||
98 | } | 98 | } |
99 | }, | 99 | }, |
100 | "mv" => { | 100 | "mv" => { |
@@ -102,6 +102,8 @@ impl Input { | |||
102 | mod_options = Some(ModOptions::Add); | 102 | mod_options = Some(ModOptions::Add); |
103 | if arg_split.len() == 2 { | 103 | if arg_split.len() == 2 { |
104 | mod_version = Some(String::from(arg_split[1])); | 104 | mod_version = Some(String::from(arg_split[1])); |
105 | } else { | ||
106 | return Err(MLError::new(ErrorType::ArgumentError, "Please specify a version id")); | ||
105 | }; | 107 | }; |
106 | }, | 108 | }, |
107 | "mr" => { | 109 | "mr" => { |
@@ -109,7 +111,9 @@ impl Input { | |||
109 | mod_options = Some(ModOptions::Remove); | 111 | mod_options = Some(ModOptions::Remove); |
110 | if arg_split.len() == 2 { | 112 | if arg_split.len() == 2 { |
111 | mod_id = Some(String::from(arg_split[1])); | 113 | mod_id = Some(String::from(arg_split[1])); |
112 | } | 114 | } else { |
115 | return Err(MLError::new(ErrorType::ArgumentError, "Please specify a mod id")); | ||
116 | }; | ||
113 | }, | 117 | }, |
114 | "set_version" => { | 118 | "set_version" => { |
115 | set_version = true; | 119 | set_version = true; |
@@ -120,7 +124,7 @@ impl Input { | |||
120 | "clean" => { | 124 | "clean" => { |
121 | clean = true; | 125 | clean = true; |
122 | }, | 126 | }, |
123 | "no-download" => { | 127 | "no_download" => { |
124 | direct_download = false; | 128 | direct_download = false; |
125 | }, | 129 | }, |
126 | "delete_old" => { | 130 | "delete_old" => { |
@@ -136,7 +140,11 @@ impl Input { | |||
136 | "la" => { | 140 | "la" => { |
137 | command = Some(Cmd::List); | 141 | command = Some(Cmd::List); |
138 | list_options = Some(ListOptions::Add); | 142 | list_options = Some(ListOptions::Add); |
139 | list_id = Some(String::from(arg_split[1])); | 143 | if arg_split.len() == 2 { |
144 | list_id = Some(String::from(arg_split[1])); | ||
145 | } else { | ||
146 | return Err(MLError::new(ErrorType::ArgumentError, "Please give the new list an id")); | ||
147 | } | ||
140 | }, | 148 | }, |
141 | "lr" => { | 149 | "lr" => { |
142 | command = Some(Cmd::List); | 150 | command = Some(Cmd::List); |
@@ -163,10 +171,18 @@ impl Input { | |||
163 | } | 171 | } |
164 | }, | 172 | }, |
165 | "ml" => { | 173 | "ml" => { |
166 | modloader = Some(Modloader::from(arg_split[1])?); | 174 | if arg_split.len() == 2 { |
175 | modloader = Some(Modloader::from(arg_split[1])?); | ||
176 | } else { | ||
177 | return Err(MLError::new(ErrorType::ArgumentError, "Please specify a modloader")); | ||
178 | } | ||
167 | }, | 179 | }, |
168 | "dir" => { | 180 | "dir" => { |
169 | directory = Some(String::from(arg_split[1])); | 181 | if arg_split.len() == 2 { |
182 | directory = Some(String::from(arg_split[1])); | ||
183 | } else { | ||
184 | return Err(MLError::new(ErrorType::ArgumentError, "Please specify a directory")); | ||
185 | } | ||
170 | }, | 186 | }, |
171 | "export" => { | 187 | "export" => { |
172 | command = Some(Cmd::Io); | 188 | command = Some(Cmd::Io); |
@@ -212,18 +228,16 @@ pub async fn get_input(config: Cfg, args: Vec<String>) -> MLE<Input> { | |||
212 | 228 | ||
213 | match input.clone().command.unwrap() { | 229 | match input.clone().command.unwrap() { |
214 | Cmd::Mod => check_mod(input, config), | 230 | Cmd::Mod => check_mod(input, config), |
215 | Cmd::List => check_list(input, config), | 231 | Cmd::List => check_list(input, config).await, |
216 | _ => Ok(input), | 232 | _ => Ok(input), |
217 | } | 233 | } |
218 | } | 234 | } |
219 | 235 | ||
220 | //Move checks to commands? translate to variables there? | ||
221 | fn check_mod(mut input: Input, config: Cfg) -> MLE<Input> { | 236 | fn check_mod(mut input: Input, config: Cfg) -> MLE<Input> { |
222 | if input.mod_options.is_none() { | 237 | if input.mod_options.is_none() { |
223 | return Err(MLError::new(ErrorType::ArgumentError, "No mod option")); | 238 | return Err(MLError::new(ErrorType::ArgumentError, "No mod option")); |
224 | }; | 239 | }; |
225 | match input.clone().mod_options.unwrap() { | 240 | match input.clone().mod_options.unwrap() { |
226 | //Check for MV if no mod-id on both | ||
227 | ModOptions::Add => { | 241 | ModOptions::Add => { |
228 | if input.mod_id.is_none() && input.mod_version.is_none() { return Err(MLError::new(ErrorType::ArgumentError, "No mod id/slug or version id")); }; | 242 | if input.mod_id.is_none() && input.mod_version.is_none() { return Err(MLError::new(ErrorType::ArgumentError, "No mod id/slug or version id")); }; |
229 | if input.list_id.is_none() { input.list = Some(get_current_list(config.clone())?); }; | 243 | if input.list_id.is_none() { input.list = Some(get_current_list(config.clone())?); }; |
@@ -236,7 +250,7 @@ fn check_mod(mut input: Input, config: Cfg) -> MLE<Input> { | |||
236 | } | 250 | } |
237 | } | 251 | } |
238 | 252 | ||
239 | fn check_list(mut input: Input, config: Cfg) -> MLE<Input> { | 253 | async fn check_list(mut input: Input, config: Cfg) -> MLE<Input> { |
240 | if input.list_options.is_none() { | 254 | if input.list_options.is_none() { |
241 | return Err(MLError::new(ErrorType::ArgumentError, "NO_LIST_ARGUMENT")); | 255 | return Err(MLError::new(ErrorType::ArgumentError, "NO_LIST_ARGUMENT")); |
242 | }; | 256 | }; |
@@ -245,11 +259,14 @@ fn check_list(mut input: Input, config: Cfg) -> MLE<Input> { | |||
245 | if input.list_id.is_none() { return Err(MLError::new(ErrorType::ArgumentError, "no list id specified")); }; | 259 | if input.list_id.is_none() { return Err(MLError::new(ErrorType::ArgumentError, "no list id specified")); }; |
246 | if input.list_mcversion.is_none() { | 260 | if input.list_mcversion.is_none() { |
247 | println!("No Minecraft Version specified, defaulting to latest release"); | 261 | println!("No Minecraft Version specified, defaulting to latest release"); |
248 | //TODO Get latest version | 262 | input.list_mcversion = Some(get_minecraft_version(config.apis.modrinth, MCVersionType::Release).await); |
249 | input.list_mcversion = Some(String::from("1.19.3")); | 263 | }; |
264 | if input.directory.is_none() { | ||
265 | let id = input.clone().list_id.unwrap(); | ||
266 | println!("No download directory specified, defaulting to ./downloads/{}", id); | ||
267 | input.directory = Some(format!("./downloads/{}", id)) | ||
250 | }; | 268 | }; |
251 | if input.modloader.is_none() { return Err(MLError::new(ErrorType::ArgumentError, "no modloader specified")); }; | 269 | if input.modloader.is_none() { return Err(MLError::new(ErrorType::ArgumentError, "no modloader specified")); }; |
252 | if input.directory.is_none() { input.directory = Some(format!("./downloads/{}", input.clone().list_id.expect("earlier if failed"))) }; | ||
253 | Ok(input) | 270 | Ok(input) |
254 | }, | 271 | }, |
255 | ListOptions::Remove => { | 272 | ListOptions::Remove => { |
diff --git a/src/main.rs b/src/main.rs index 2fca691..d177c3e 100644 --- a/src/main.rs +++ b/src/main.rs | |||
@@ -1,6 +1,6 @@ | |||
1 | use std::{env, process}; | 1 | use std::{env, process}; |
2 | 2 | ||
3 | use modlist::{config::Cfg, input::{get_input, Cmd}, update, download, list, io}; | 3 | use modlist::{config::Cfg, input::{get_input, Cmd}, update, download, list, io, modification}; |
4 | 4 | ||
5 | #[tokio::main] | 5 | #[tokio::main] |
6 | async fn main() { | 6 | async fn main() { |
@@ -23,7 +23,7 @@ async fn main() { | |||
23 | 23 | ||
24 | match input.clone().command.unwrap() { | 24 | match input.clone().command.unwrap() { |
25 | Cmd::Mod => { | 25 | Cmd::Mod => { |
26 | Ok(()) | 26 | modification(config, input).await |
27 | }, | 27 | }, |
28 | Cmd::List => { | 28 | Cmd::List => { |
29 | list(config, input).await | 29 | list(config, input).await |