From cbfaf4fd6e3ec23234401bcd441d6e9c1145affb Mon Sep 17 00:00:00 2001 From: marceline-cramer Date: Tue, 30 Nov 2021 17:30:29 -0700 Subject: [PATCH] Add get params to SearchArgs + migrate README todos --- README.md | 7 +------ src/main.rs | 23 +++++++++++++++-------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 4e19ed9..13964d2 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ A Minecraft mod manager for the terminal. - zsh autocomplete - nushell autocomplete - manpage +- configurable mod search result display like [Starship](https://starship.rs) Long-term/host-dependent: - conflict resolution @@ -95,12 +96,6 @@ $ hopper add sodium --mc-version 1.17 :: ... ``` -- configurable mod search results like [Starship](https://starship.rs) -- pad mod indices based on largest number -- add parameter to restrict target Minecraft version -- manually pick out Minecraft version -- square colored creeper face progress indicator (from top-left clockwise spiral in) - ## `hopper get` Just like `hopper add` but simply downloads a mod jar to the current directory. diff --git a/src/main.rs b/src/main.rs index 9b90f43..60720c2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,18 +7,23 @@ use std::io::Write; use std::path::PathBuf; use structopt::StructOpt; +// TODO parameter to restrict target Minecraft version +#[derive(StructOpt, Clone, Debug)] +struct SearchArgs { + package_name: String, +} + // TODO use ColoredHelp by default? -// TODO move each enum value to a dedicated struct #[derive(StructOpt, Clone, Debug)] enum Command { /// Adds a mod to the current instance #[structopt(setting = structopt::clap::AppSettings::ColoredHelp)] - Add { package_name: String }, + Add(SearchArgs), /// Removes a mod #[structopt(setting = structopt::clap::AppSettings::ColoredHelp)] Remove { package_name: String }, #[structopt(setting = structopt::clap::AppSettings::ColoredHelp)] - Get { package_name: String }, + Get(SearchArgs), #[structopt(setting = structopt::clap::AppSettings::ColoredHelp)] Update, #[structopt(setting = structopt::clap::AppSettings::ColoredHelp)] @@ -206,10 +211,10 @@ struct ModVersionFile { filename: String, } -async fn search_mods(ctx: &AppContext, query: String) -> anyhow::Result { +async fn search_mods(ctx: &AppContext, search_args: &SearchArgs) -> anyhow::Result { let client = reqwest::Client::new(); let url = format!("https://{}/api/v1/mod", ctx.config.upstream.server_address); - let params = [("query", query.as_str())]; + let params = [("query", search_args.package_name.as_str())]; let url = reqwest::Url::parse_with_params(url.as_str(), ¶ms)?; let response = client .get(url) @@ -220,6 +225,7 @@ async fn search_mods(ctx: &AppContext, query: String) -> anyhow::Result anyho let total_size = response.content_length().unwrap(); // TODO better colors and styling! + // TODO square colored creeper face progress indicator (from top-left clockwise spiral in) use indicatif::{ProgressBar, ProgressStyle}; let pb = ProgressBar::new(total_size); pb.set_style(ProgressStyle::default_bar().template("{msg}\n{spinner:.green} [{elapsed_precise}] [{wide_bar:.cyan/blue}] {bytes}/{total_bytes} ({bytes_per_sec}, {eta})").progress_chars("#>-")); @@ -336,8 +343,8 @@ async fn download_version_file(ctx: &AppContext, file: &ModVersionFile) -> anyho Ok(()) } -async fn cmd_get(ctx: &AppContext, package_name: String) -> anyhow::Result<()> { - let response = search_mods(ctx, package_name).await?; +async fn cmd_get(ctx: &AppContext, search_args: SearchArgs) -> anyhow::Result<()> { + let response = search_mods(ctx, &search_args).await?; if response.hits.is_empty() { // TODO formatting @@ -377,7 +384,7 @@ async fn main() -> anyhow::Result<()> { let config = args.load_config()?; let ctx = AppContext { args, config }; match ctx.args.to_owned().command { - Command::Get { package_name } => cmd_get(&ctx, package_name).await, + Command::Get(search_args) => cmd_get(&ctx, search_args).await, _ => unimplemented!("unimplemented subcommand"), } }