summaryrefslogtreecommitdiff
path: root/src/commands/update.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/commands/update.rs')
-rw-r--r--src/commands/update.rs88
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 @@
1use std::io::{Error, ErrorKind}; 1use std::io::{Error, ErrorKind};
2 2
3use 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}; 3use 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
5pub async fn update(config: Cfg, input: Input) -> Result<(), Box<dyn std::error::Error>> { 5pub 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 = &current_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 = &current_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 = &current_list.download_folder;
39 let dl_path = &current_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}