anidl 3.0.6

A simple anime downloader that uses GoGoAnime as a source
Documentation
use gogoanime_scraper::{input_handler, parser, print_handleing::*, scraper, utils, BASE_URL};
use std::process::exit;

#[tokio::main]
async fn main() {
    let args: Vec<String> = std::env::args().collect();
    let url_ending = get_url_ending(args);
    let scraper_url_base = get_scraper_url_base(&url_ending);

    let body = fetch_html_body(scraper_url_base)
        .await
        .expect("Failed to retrieve HTML content");

    let (anime_url, anime_name) = get_anime_details(body);

    validate_anime_url(&anime_url, &url_ending);

    print_anime_list(&anime_name);

    let (chosen_anime, path) = get_chosen_anime(&anime_name);
    let anime_url_ending = get_anime_url_ending(anime_url, chosen_anime);

    utils::clear_terminal_screen();
    debug_print(&format!("Chosen anime: {}", anime_url_ending));

    match scraper::get_anime_episodes_and_download_the_episodes(anime_url_ending, &path).await {
        Ok(_) => success_print("Successfully downloaded all of the episodes"),
        Err(_) => error_print("Failed to download all of the episodes"),
    }
}

fn get_url_ending(args: Vec<String>) -> String {
    if args.len() > 1 {
        input_handler::trim(args[1].clone())
    } else {
        input_handler::init_input()
    }
}

fn get_scraper_url_base(url_ending: &str) -> String {
    format!("{}{}", BASE_URL, url_ending)
}

async fn fetch_html_body(scraper_url_base: String) -> Result<String, reqwest::Error> {
    utils::get_html(scraper_url_base).await
}

fn get_anime_details(body: String) -> (Result<Vec<String>, &'static str>, Vec<String>) {
    let anime_url = parser::get_anime_url(body.clone());
    let anime_name = parser::get_anime_name(body);
    (anime_url, anime_name)
}

fn validate_anime_url(anime_url: &Result<Vec<String>, &'static str>, url_ending: &str) {
    if anime_url.clone().unwrap().is_empty() {
        error_print(&format!("No anime found with the name: {}", url_ending));
        exit(1);
    }
}

fn get_chosen_anime(anime_name: &[String]) -> (usize, String) {
    let chosen_anime = input_handler::number_parser().unwrap();
    let path = anime_name[chosen_anime - 1].clone();
    (chosen_anime, path)
}

fn get_anime_url_ending(
    anime_url: Result<Vec<String>, &'static str>,
    chosen_anime: usize,
) -> String {
    match anime_url {
        Ok(urls) => urls[chosen_anime - 1].clone(),
        Err(e) => panic!("Error retrieving anime URL: {}", e),
    }
}