summaryrefslogtreecommitdiff
path: root/src/commands/download.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/commands/download.rs')
-rw-r--r--src/commands/download.rs184
1 files changed, 95 insertions, 89 deletions
diff --git a/src/commands/download.rs b/src/commands/download.rs
index 7af1066..7ea5c29 100644
--- a/src/commands/download.rs
+++ b/src/commands/download.rs
@@ -1,5 +1,3 @@
1#![allow(clippy::too_many_lines)]
2
3use indicatif::{MultiProgress, ProgressBar, ProgressStyle}; 1use indicatif::{MultiProgress, ProgressBar, ProgressStyle};
4 2
5use crate::{config::Cfg, List}; 3use crate::{config::Cfg, List};
@@ -35,105 +33,113 @@ pub async fn download(
35 ); 33 );
36 34
37 for current_list in liststack { 35 for current_list in liststack {
38 download_p.set_message(format!("Download in {}", current_list.id)); 36 download_list(config, mp.clone(), download_p.clone(), current_list, clean, delete_old).await?;
39 37 }
40 let downloaded_versions = get_downloaded_versions(&current_list)?;
41 let current_version_ids =
42 match userlist_get_all_current_versions_with_mods(
43 config,
44 &current_list.id,
45 ) {
46 Ok(i) => Ok(i),
47 Err(e) => {
48 Err(MLErr::new(EType::DBError, e.to_string().as_str()))
49 }
50 }?;
51
52 let mut to_download: Vec<String> = vec![];
53 //(mod_id, version_id)
54 let mut to_disable: Vec<(String, String)> = vec![];
55
56 for version in current_version_ids {
57 let mod_id = version.0;
58 let current_version = version.1;
59
60 let current_download = downloaded_versions.get(&mod_id);
61
62 if current_download.is_none() || clean {
63 to_download.push(current_version);
64 } else {
65 let downloaded_version = current_download
66 .ok_or(MLErr::new(EType::Other, "IDK, WTF"))?;
67 if &current_version != downloaded_version {
68 to_disable.push((
69 mod_id.clone(),
70 String::from(downloaded_version),
71 ));
72 to_download.push(current_version);
73 }
74 }
75 }
76 38
77 if clean { 39 download_p.finish_with_message("Downloaded all lists");
78 clean_list_dir(&current_list)?; 40
79 }; 41 Ok(())
42}
43
44async fn download_list(
45 config: &Cfg,
46 mp: MultiProgress,
47 download_p: ProgressBar,
48 current_list: List,
49 clean: bool,
50 delete_old: bool,
51) -> MLE<()> {
52 download_p.set_message(format!("Download in {}", current_list.id));
53
54 let downloaded_versions = get_downloaded_versions(&current_list)?;
55 let current_version_ids = match userlist_get_all_current_versions_with_mods(
56 config,
57 &current_list.id,
58 ) {
59 Ok(i) => Ok(i),
60 Err(e) => Err(MLErr::new(EType::DBError, e.to_string().as_str())),
61 }?;
62
63 let mut to_download: Vec<String> = vec![];
64 //(mod_id, version_id)
65 let mut to_disable: Vec<(String, String)> = vec![];
66
67 for version in current_version_ids {
68 let mod_id = version.0;
69 let current_version = version.1;
80 70
81 if to_download.is_empty() { 71 let current_download = downloaded_versions.get(&mod_id);
82 download_p.println(format!( 72
83 "There are no new versions to download for {}", 73 if current_download.is_none() || clean {
84 current_list.id 74 to_download.push(current_version);
85 ));
86 } else { 75 } else {
87 download_versions( 76 let downloaded_version =
88 current_list.clone(), 77 current_download.ok_or(MLErr::new(EType::Other, "IDK, WTF"))?;
89 config.clone(), 78 if &current_version != downloaded_version {
90 get_raw_versions(&config.apis.modrinth, to_download).await?, 79 to_disable
91 &mp, 80 .push((mod_id.clone(), String::from(downloaded_version)));
92 &download_p, 81 to_download.push(current_version);
93 ) 82 }
94 .await?;
95 } 83 }
84 }
96 85
97 if !to_disable.is_empty() { 86 if clean {
98 let d_p = 87 clean_list_dir(&current_list)?;
99 mp.insert_before( 88 };
100 &download_p, 89
101 ProgressBar::new(to_disable.len().try_into().map_err( 90 if to_download.is_empty() {
102 |_| MLErr::new(EType::Other, "ListStackLen"), 91 download_p.println(format!(
103 )?), 92 "There are no new versions to download for {}",
104 ); 93 current_list.id
105 d_p.set_style( 94 ));
106 ProgressStyle::with_template(STYLE_BAR_POS) 95 } else {
107 .map_err(|_| { 96 download_versions(
108 MLErr::new(EType::LibIndicatif, "template error") 97 current_list.clone(),
109 })? 98 config.clone(),
110 .progress_chars(PROGRESS_CHARS), 99 get_raw_versions(&config.apis.modrinth, to_download).await?,
111 ); 100 &mp,
112 for ver in to_disable { 101 &download_p,
113 if delete_old { 102 )
114 d_p.set_message(format!("Delete version {}", ver.1)); 103 .await?;
115 d_p.inc(1); 104 }
116 delete_version(&current_list, &ver.1)?;
117 } else {
118 d_p.set_message(format!("Disable version {}", ver.1));
119 d_p.inc(1);
120 disable_version(config, &current_list, ver.1, ver.0)?;
121 };
122 }
123 105
124 let del_msg = if delete_old { 106 if !to_disable.is_empty() {
125 "Deleted all old versions" 107 let d_p = mp.insert_before(
108 &download_p,
109 ProgressBar::new(
110 to_disable
111 .len()
112 .try_into()
113 .map_err(|_| MLErr::new(EType::Other, "ListStackLen"))?,
114 ),
115 );
116 d_p.set_style(
117 ProgressStyle::with_template(STYLE_BAR_POS)
118 .map_err(|_| MLErr::new(EType::LibIndicatif, "template error"))?
119 .progress_chars(PROGRESS_CHARS),
120 );
121 for ver in to_disable {
122 if delete_old {
123 d_p.set_message(format!("Delete version {}", ver.1));
124 d_p.inc(1);
125 delete_version(&current_list, &ver.1)?;
126 } else { 126 } else {
127 "Disabled all old versions" 127 d_p.set_message(format!("Disable version {}", ver.1));
128 d_p.inc(1);
129 disable_version(config, &current_list, ver.1, ver.0)?;
128 }; 130 };
129
130 d_p.finish_with_message(del_msg);
131 } 131 }
132 132
133 download_p.inc(1); 133 let del_msg = if delete_old {
134 "Deleted all old versions"
135 } else {
136 "Disabled all old versions"
137 };
138
139 d_p.finish_with_message(del_msg);
134 } 140 }
135 141
136 download_p.finish_with_message("Downloaded all lists"); 142 download_p.inc(1);
137 143
138 Ok(()) 144 Ok(())
139} 145}