diff --git a/src/main.rs b/src/main.rs index 90bdde1..d74e49c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,11 @@ mod models; mod utils; -use crate::{models::{vanilla::{VanillaVersionDetail, VanillaVersionType, VanillaVersions}}, utils::{with_progressbar, with_spinner}}; use crate::models::fabric::FabricVersions; +use crate::{ + models::vanilla::{VanillaVersionDetail, VanillaVersionType, VanillaVersions}, + utils::{with_progressbar, with_spinner}, +}; use clap::{ Parser, Subcommand, builder::styling::{self}, @@ -10,7 +13,7 @@ use clap::{ use dialoguer::{FuzzySelect, Select, theme::ColorfulTheme}; use futures_util::StreamExt; use sha1::{Digest, Sha1}; -use std::{error::Error, fmt::format}; +use std::error::Error; use tokio::io::AsyncWriteExt; fn styles() -> styling::Styles { @@ -55,7 +58,8 @@ async fn main() -> Result<(), Box> { let res = with_spinner("", "", || async { let res: VanillaVersions = reqwest::get(URL).await?.json().await?; Ok(res) - }).await?; + }) + .await?; let release_versions = res .versions @@ -73,32 +77,39 @@ async fn main() -> Result<(), Box> { .default(0) .interact()?; - let version_detail: VanillaVersionDetail = - with_spinner("", "", || async { - let version_detail: VanillaVersionDetail = - reqwest::get(release_versions[version_index].url.clone()) - .await? - .json() - .await?; - Ok(version_detail) - }).await?; + let version_detail: VanillaVersionDetail = with_spinner("", "", || async { + let version_detail: VanillaVersionDetail = + reqwest::get(release_versions[version_index].url.clone()) + .await? + .json() + .await?; + Ok(version_detail) + }) + .await?; let start_msg = format!( "downloading server.jar for {} {}", loaders[loader_index], release_version_names[version_index] ); - with_progressbar(&start_msg, "download finished", version_detail.downloads.server.size, |pb| async move { - let server_bytes = reqwest::get(version_detail.downloads.server.url).await?; - let mut file = tokio::fs::File::create("server.jar").await?; - let mut stream = server_bytes.bytes_stream(); + with_progressbar( + &start_msg, + "download finished", + version_detail.downloads.server.size, + |pb| async move { + let server_bytes = + reqwest::get(version_detail.downloads.server.url).await?; + let mut file = tokio::fs::File::create("server.jar").await?; + let mut stream = server_bytes.bytes_stream(); - while let Some(chunk) = stream.next().await { - let chunk = chunk?; - file.write_all(&chunk).await?; - pb.inc(chunk.len() as u64); - } - Ok(()) - }).await?; + while let Some(chunk) = stream.next().await { + let chunk = chunk?; + file.write_all(&chunk).await?; + pb.inc(chunk.len() as u64); + } + Ok(()) + }, + ) + .await?; with_spinner("verifying sha1 hash", "sha1 hash verified", || async { let data = tokio::fs::read("server.jar").await?; @@ -112,16 +123,19 @@ async fn main() -> Result<(), Box> { return Err("sha1 verifaction failed for downloaded file".into()); } Ok(()) - }).await?; + }) + .await?; } 1 => { const URL: &str = "https://meta.fabricmc.net/v2/versions"; let res = with_spinner("", "", || async { let res: FabricVersions = reqwest::get(URL).await?.json().await?; Ok(res) - }).await?; + }) + .await?; - let game_version_names = res.game + let game_version_names = res + .game .iter() .filter(|game| game.stable) .map(|game| game.version.clone()) @@ -133,7 +147,8 @@ async fn main() -> Result<(), Box> { .default(0) .interact()?; - let loader_version_names = res.loader + let loader_version_names = res + .loader .iter() .filter(|loader| loader.stable) .map(|loader| loader.version.clone()) @@ -147,16 +162,22 @@ async fn main() -> Result<(), Box> { let game_version = game_version_names[game_version_index].clone(); let loader_version = loader_version_names[loader_version_index].clone(); - let installer_version = res.installer + let installer_version = res + .installer .iter() .find_map(|installer| { - if installer.stable { Some(installer.version.clone()) } - else { None } - }).ok_or("No Installer Version Found")?; + if installer.stable { + Some(installer.version.clone()) + } else { + None + } + }) + .ok_or("No Installer Version Found")?; let start_msg = format!( "downloading server.jar for {} {}, {}", - loaders[loader_index], loader_version_names[loader_version_index], + loaders[loader_index], + loader_version_names[loader_version_index], game_version_names[game_version_index], ); with_spinner(&start_msg, "download finished", || async { @@ -173,8 +194,8 @@ async fn main() -> Result<(), Box> { } Ok(()) - }).await?; - + }) + .await?; } _ => return Err("Invalid selection".into()), } diff --git a/src/models/mod.rs b/src/models/mod.rs index 16ff910..0855604 100644 --- a/src/models/mod.rs +++ b/src/models/mod.rs @@ -1,2 +1,2 @@ -pub mod vanilla; pub mod fabric; +pub mod vanilla; diff --git a/src/utils.rs b/src/utils.rs index 5672b7c..9b539ce 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,5 +1,5 @@ -use std::{error::Error, future::Future}; use indicatif::{ProgressBar, ProgressStyle}; +use std::{error::Error, future::Future}; pub async fn with_spinner( start_msg: &str, @@ -19,7 +19,6 @@ where pb.finish_and_clear(); if !finish_msg.is_empty() { println!("{} {}", dialoguer::console::style("✔").green(), finish_msg); - } result @@ -31,14 +30,15 @@ pub async fn with_progressbar( len: u64, f: F, ) -> Result> -where +where F: FnOnce(ProgressBar) -> Fut, - Fut: Future>> + Fut: Future>>, { let pb = ProgressBar::new(len); - pb.set_style(ProgressStyle::default_bar().template( - "{msg}\n{bar:40.green/white} {bytes}/{total_bytes} ({bytes_per_sec})", - )?); + pb.set_style( + ProgressStyle::default_bar() + .template("{msg}\n{bar:40.green/white} {bytes}/{total_bytes} ({bytes_per_sec})")?, + ); pb.set_message(start_msg.to_string()); let result = f(pb.clone()).await;