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> = 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 japanese_title = &sauce_info.title.japanese.unwrap_or_default(); let english_title = &sauce_info.title.english.unwrap_or_default(); if english_title.as_str() != "" { text.push_str(&english_title); if japanese_title.as_str() != "" { 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; } } }