nhentairs/src/commands/view.rs

66 lines
2.4 KiB
Rust

use crate::utils;
use std::env;
use std::process::exit;
use tokio::task::JoinHandle;
use std::collections::BTreeMap;
extern crate tokio;
extern crate reqwest;
pub async fn run(args: env::Args) {
let sauces = utils::get_arg_sauces(args).unwrap();
let mut remaining_to_show = sauces.len();
if remaining_to_show < 1 {
eprintln!("Missing sauce(s)");
exit(1);
}
let client = reqwest::Client::new();
let mut handles: Vec<JoinHandle<String>> = Vec::new();
for sauce in sauces {
let cloned_client = client.clone();
handles.push(tokio::spawn(async move {
let sauce_info = utils::get_sauce_info(cloned_client, sauce).await.unwrap();
let mut text = format!("Sauce: {}\nTitle: ", sauce_info.id);
let english_title = sauce_info.title.english;
let japanese_title = sauce_info.title.japanese;
if english_title != "" {
text.push_str(&english_title);
if japanese_title != "" {
text.push_str(&format!("\nJapanese Title: {}", &japanese_title));
}
} else {
text.push_str(&japanese_title);
}
let mut tag_hashmap = BTreeMap::new();
for tag_info in sauce_info.tags {
let tag_key = tag_info.r#type;
let tag_value = tag_info.name;
let tag_vec = tag_hashmap.entry(tag_key).or_insert(Vec::new());
tag_vec.push(tag_value);
}
for (tag_key, tag_value) in &tag_hashmap {
let tag_key = match tag_key.as_str() {
"tag" => "Tags",
"artist" => "Artists",
"parody" => "Parodies",
"character" => "Characters",
"group" => "Groups",
"language" => "Languages",
"category" => "Categories",
_ => tag_key
};
text.push_str(&format!("\n{}: {}", tag_key, tag_value.join(", ")));
}
text.push_str(&format!("\nPages: {}\nFavorites: {}", sauce_info.num_pages, sauce_info.num_favorites));
text
}));
}
for handle in handles {
println!("{}", handle.await.unwrap());
if remaining_to_show > 1 {
println!("");
remaining_to_show -= 1;
}
}
}