diff options
Diffstat (limited to 'src/commands/update.rs')
-rw-r--r-- | src/commands/update.rs | 88 |
1 files changed, 49 insertions, 39 deletions
diff --git a/src/commands/update.rs b/src/commands/update.rs index eba5e91..42d19aa 100644 --- a/src/commands/update.rs +++ b/src/commands/update.rs | |||
@@ -1,50 +1,60 @@ | |||
1 | use std::io::{Error, ErrorKind}; | 1 | use std::io::{Error, ErrorKind}; |
2 | 2 | ||
3 | use crate::{config::Cfg, modrinth::{projects, Project, versions, extract_current_version, Version}, get_current_list, db::{userlist_get_all_ids, mods_get_versions, userlist_get_applicable_versions, userlist_change_versions}, List, input::Input, download_file}; | 3 | use crate::{config::Cfg, modrinth::{projects, Project, versions, extract_current_version, Version}, get_current_list, db::{userlist_get_all_ids, mods_get_versions, userlist_get_applicable_versions, userlist_change_versions, lists_get_all_ids, lists_get}, List, input::Input, download_file}; |
4 | 4 | ||
5 | pub async fn update(config: Cfg, input: Input) -> Result<(), Box<dyn std::error::Error>> { | 5 | pub async fn update(config: Cfg, input: Input) -> Result<(), Box<dyn std::error::Error>> { |
6 | |||
7 | let current_list = get_current_list(config.clone())?; | ||
8 | |||
9 | let mods = userlist_get_all_ids(config.clone(), current_list.clone().id)?; | ||
10 | |||
11 | let mut versions = mods_get_versions(config.clone(), mods.clone())?; | ||
12 | versions.sort_by_key(|ver| ver.mod_id.clone()); | ||
13 | |||
14 | let mut projects = projects(String::from(&config.apis.modrinth), mods).await; | ||
15 | projects.sort_by_key(|pro| pro.id.clone()); | ||
16 | 6 | ||
17 | let mut updatestack: Vec<Version> = vec![]; | 7 | let mut liststack: Vec<List> = vec![]; |
18 | for (index, project) in projects.into_iter().enumerate() { | 8 | if input.all_lists { |
19 | //Get versions for project and check if they match up | 9 | let list_ids = lists_get_all_ids(config.clone())?; |
20 | let current_version = &versions[index]; | 10 | for id in list_ids { |
21 | let p_id = String::from(&project.id); | 11 | liststack.push(lists_get(config.clone(), id)?); |
22 | let v_id = ¤t_version.mod_id; | 12 | } |
23 | if &p_id != v_id { return Err(Box::new(Error::new(ErrorKind::Other, "SORTING_ERROR"))) }; | 13 | } else { |
24 | 14 | liststack.push(get_current_list(config.clone())?) | |
25 | 15 | } | |
26 | //Adding to stack if not the same versions in the list OR if clean == true | 16 | |
27 | if input.clone().clean || (project.versions.join("|") != current_version.versions) { | 17 | for current_list in liststack { |
28 | updatestack.push(match specific_update(config.clone(), input.clone(), current_list.clone(), project.clone()).await { | 18 | let mods = userlist_get_all_ids(config.clone(), current_list.clone().id)?; |
29 | Ok(ver) => ver, | 19 | |
30 | //TODO handle errors (only continue on "NO_UPDATE_AVAILABLE") | 20 | let mut versions = mods_get_versions(config.clone(), mods.clone())?; |
31 | Err(_) => { println!("({}) No new version found for the specified minecraft version", project.title); continue; }, | 21 | versions.sort_by_key(|ver| ver.mod_id.clone()); |
32 | }); | 22 | |
33 | } else { | 23 | let mut projects = projects(String::from(&config.apis.modrinth), mods).await; |
34 | println!("({}) No new version found", project.title); | 24 | projects.sort_by_key(|pro| pro.id.clone()); |
25 | |||
26 | let mut updatestack: Vec<Version> = vec![]; | ||
27 | for (index, project) in projects.into_iter().enumerate() { | ||
28 | //Get versions for project and check if they match up | ||
29 | let current_version = &versions[index]; | ||
30 | let p_id = String::from(&project.id); | ||
31 | let v_id = ¤t_version.mod_id; | ||
32 | if &p_id != v_id { return Err(Box::new(Error::new(ErrorKind::Other, "SORTING_ERROR"))) }; | ||
33 | |||
34 | |||
35 | //Adding to stack if not the same versions in the list OR if clean == true | ||
36 | if input.clone().clean || (project.versions.join("|") != current_version.versions) { | ||
37 | updatestack.push(match specific_update(config.clone(), input.clone(), current_list.clone(), project.clone()).await { | ||
38 | Ok(ver) => ver, | ||
39 | //TODO handle errors (only continue on "NO_UPDATE_AVAILABLE") | ||
40 | Err(_) => { println!("({}) No new version found for the specified minecraft version", project.title); continue; }, | ||
41 | }); | ||
42 | } else { | ||
43 | println!("({}) No new version found", project.title); | ||
44 | }; | ||
35 | }; | 45 | }; |
36 | }; | 46 | |
37 | 47 | if input.clean { | |
38 | if input.clean { | 48 | let dl_path = ¤t_list.download_folder; |
39 | let dl_path = ¤t_list.download_folder; | 49 | println!("Cleaning {}", dl_path); |
40 | println!("Cleaning {}", dl_path); | 50 | for entry in std::fs::read_dir(dl_path)? { |
41 | for entry in std::fs::read_dir(dl_path)? { | 51 | let entry = entry?; |
42 | let entry = entry?; | 52 | std::fs::remove_file(entry.path())?; |
43 | std::fs::remove_file(entry.path())?; | 53 | } |
44 | } | 54 | } |
55 | |||
56 | if input.direct_download { download_updates(current_list, updatestack).await?; }; | ||
45 | } | 57 | } |
46 | |||
47 | if input.direct_download { download_updates(current_list, updatestack).await?; }; | ||
48 | 58 | ||
49 | Ok(()) | 59 | Ok(()) |
50 | } | 60 | } |