asdf
This commit is contained in:
		
							parent
							
								
									733b9650e6
								
							
						
					
					
						commit
						33691e38df
					
				
							
								
								
									
										136
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										136
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							| 
						 | 
				
			
			@ -2,59 +2,12 @@
 | 
			
		|||
# It is not intended for manual editing.
 | 
			
		||||
version = 3
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "atty"
 | 
			
		||||
version = "0.2.14"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "hermit-abi",
 | 
			
		||||
 "libc",
 | 
			
		||||
 "winapi",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "autocfg"
 | 
			
		||||
version = "1.1.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "bitflags"
 | 
			
		||||
version = "1.3.2"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "cfg-if"
 | 
			
		||||
version = "1.0.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "clap"
 | 
			
		||||
version = "3.2.25"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "atty",
 | 
			
		||||
 "bitflags",
 | 
			
		||||
 "clap_lex",
 | 
			
		||||
 "indexmap",
 | 
			
		||||
 "strsim",
 | 
			
		||||
 "termcolor",
 | 
			
		||||
 "textwrap",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "clap_lex"
 | 
			
		||||
version = "0.2.4"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "os_str_bytes",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "getrandom"
 | 
			
		||||
version = "0.2.12"
 | 
			
		||||
| 
						 | 
				
			
			@ -66,31 +19,6 @@ dependencies = [
 | 
			
		|||
 "wasi",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "hashbrown"
 | 
			
		||||
version = "0.12.3"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "hermit-abi"
 | 
			
		||||
version = "0.1.19"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "libc",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "indexmap"
 | 
			
		||||
version = "1.9.3"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "autocfg",
 | 
			
		||||
 "hashbrown",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "itoa"
 | 
			
		||||
version = "1.0.10"
 | 
			
		||||
| 
						 | 
				
			
			@ -104,16 +32,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		|||
checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "os_str_bytes"
 | 
			
		||||
version = "6.6.1"
 | 
			
		||||
name = "once_cell"
 | 
			
		||||
version = "1.19.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1"
 | 
			
		||||
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "pokerust"
 | 
			
		||||
version = "0.1.0"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "clap",
 | 
			
		||||
 "once_cell",
 | 
			
		||||
 "rand",
 | 
			
		||||
 "serde",
 | 
			
		||||
 "serde_json",
 | 
			
		||||
| 
						 | 
				
			
			@ -210,38 +138,17 @@ dependencies = [
 | 
			
		|||
 "serde",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "strsim"
 | 
			
		||||
version = "0.10.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "syn"
 | 
			
		||||
version = "2.0.53"
 | 
			
		||||
version = "2.0.55"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032"
 | 
			
		||||
checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "proc-macro2",
 | 
			
		||||
 "quote",
 | 
			
		||||
 "unicode-ident",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "termcolor"
 | 
			
		||||
version = "1.4.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "winapi-util",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "textwrap"
 | 
			
		||||
version = "0.16.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "unicode-ident"
 | 
			
		||||
version = "1.0.12"
 | 
			
		||||
| 
						 | 
				
			
			@ -253,34 +160,3 @@ name = "wasi"
 | 
			
		|||
version = "0.11.0+wasi-snapshot-preview1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "winapi"
 | 
			
		||||
version = "0.3.9"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "winapi-i686-pc-windows-gnu",
 | 
			
		||||
 "winapi-x86_64-pc-windows-gnu",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "winapi-i686-pc-windows-gnu"
 | 
			
		||||
version = "0.4.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "winapi-util"
 | 
			
		||||
version = "0.1.6"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "winapi",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "winapi-x86_64-pc-windows-gnu"
 | 
			
		||||
version = "0.4.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,7 +6,7 @@ edition = "2021"
 | 
			
		|||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 | 
			
		||||
 | 
			
		||||
[dependencies]
 | 
			
		||||
rand = "0.8"
 | 
			
		||||
serde = { version = "1.0", features = ["derive"] }
 | 
			
		||||
serde_json = "1.0"
 | 
			
		||||
clap = "3.0"
 | 
			
		||||
rand = "0.8"
 | 
			
		||||
once_cell = "1.8.0"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										299
									
								
								src/main.rs
									
									
									
									
									
								
							
							
						
						
									
										299
									
								
								src/main.rs
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -1,139 +1,196 @@
 | 
			
		|||
use clap::{App, Arg};
 | 
			
		||||
use rand::{thread_rng, Rng};
 | 
			
		||||
use serde::{Deserialize, Serialize};
 | 
			
		||||
use std::fs;
 | 
			
		||||
use std::{fs::File, io::Read, path::Path};
 | 
			
		||||
use rand::Rng;
 | 
			
		||||
use std::io::prelude::*;
 | 
			
		||||
 | 
			
		||||
fn main() {
 | 
			
		||||
    let matches = App::new("pokemon-colorscripts")
 | 
			
		||||
        .version("0.1.0")
 | 
			
		||||
        .author("Your Name")
 | 
			
		||||
        .about("Displays Pokemon in your terminal")
 | 
			
		||||
        .arg(
 | 
			
		||||
            Arg::with_name("list")
 | 
			
		||||
                .short('l')
 | 
			
		||||
                .long("list")
 | 
			
		||||
                .help("Print list of all Pokemon"),
 | 
			
		||||
        )
 | 
			
		||||
        .arg(
 | 
			
		||||
            Arg::with_name("name")
 | 
			
		||||
                .short('n')
 | 
			
		||||
                .long("name")
 | 
			
		||||
                .value_name("NAME")
 | 
			
		||||
                .help("Select Pokémon by name.")
 | 
			
		||||
                .takes_value(true),
 | 
			
		||||
        )
 | 
			
		||||
        .arg(
 | 
			
		||||
            Arg::with_name("form")
 | 
			
		||||
                .short('f')
 | 
			
		||||
                .long("form")
 | 
			
		||||
                .value_name("FORM")
 | 
			
		||||
                .help("Show an alternate form of a Pokémon")
 | 
			
		||||
                .takes_value(true),
 | 
			
		||||
        )
 | 
			
		||||
        .arg(
 | 
			
		||||
            Arg::with_name("shiny")
 | 
			
		||||
                .short('s')
 | 
			
		||||
                .long("shiny")
 | 
			
		||||
                .help("Show the shiny version of the Pokémon instead"),
 | 
			
		||||
        )
 | 
			
		||||
        .arg(
 | 
			
		||||
            Arg::with_name("big")
 | 
			
		||||
                .short('b')
 | 
			
		||||
                .long("big")
 | 
			
		||||
                .help("Show a larger version of the sprite"),
 | 
			
		||||
        )
 | 
			
		||||
        .arg(
 | 
			
		||||
            Arg::with_name("random")
 | 
			
		||||
                .short('r')
 | 
			
		||||
                .long("random")
 | 
			
		||||
                .value_name("GEN")
 | 
			
		||||
                .help("Show a random Pokémon. Optionally specify a generation.")
 | 
			
		||||
                .takes_value(true),
 | 
			
		||||
        )
 | 
			
		||||
        // Add more arguments as per your Python script
 | 
			
		||||
        .get_matches();
 | 
			
		||||
// set global constants
 | 
			
		||||
const PROGRAM: once_cell::sync::Lazy<std::path::PathBuf> =
 | 
			
		||||
    once_cell::sync::Lazy::new(|| std::env::current_exe().unwrap());
 | 
			
		||||
 | 
			
		||||
    if matches.is_present("list") {
 | 
			
		||||
        list_pokemon_names();
 | 
			
		||||
const PROGRAM_DIR: once_cell::sync::Lazy<std::path::PathBuf> = once_cell::sync::Lazy::new(|| {
 | 
			
		||||
    std::path::PathBuf::from(std::env::current_exe().unwrap().parent().unwrap())
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const COLORSCRIPTS_DIR: once_cell::sync::Lazy<std::path::PathBuf> =
 | 
			
		||||
    once_cell::sync::Lazy::new(|| PROGRAM_DIR.join("colorscripts"));
 | 
			
		||||
 | 
			
		||||
const REGULAR_SUBDIR: &str = "regular";
 | 
			
		||||
const SHINY_SUBDIR: &str = "shiny";
 | 
			
		||||
 | 
			
		||||
const LARGE_SUBDIR: &str = "large";
 | 
			
		||||
const SMALL_SUBDIR: &str = "small";
 | 
			
		||||
 | 
			
		||||
const SHINY_RATE: f64 = 1.0 / 128.0;
 | 
			
		||||
 | 
			
		||||
const GENERATIONS: [(&str, (u32, u32)); 8] = [
 | 
			
		||||
    ("1", (1, 151)),
 | 
			
		||||
    ("2", (152, 251)),
 | 
			
		||||
    ("3", (252, 386)),
 | 
			
		||||
    ("4", (387, 493)),
 | 
			
		||||
    ("5", (494, 649)),
 | 
			
		||||
    ("6", (650, 721)),
 | 
			
		||||
    ("7", (722, 809)),
 | 
			
		||||
    ("8", (810, 898)),
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
fn print_file(filepath: &std::path::Path) -> std::io::Result<()> {
 | 
			
		||||
    let file = std::fs::File::open(filepath)?;
 | 
			
		||||
    let reader = std::io::BufReader::new(file);
 | 
			
		||||
 | 
			
		||||
    for line in reader.lines() {
 | 
			
		||||
        println!("{}", line?);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if let Some(name) = matches.value_of("name") {
 | 
			
		||||
        let shiny = matches.is_present("shiny");
 | 
			
		||||
        let is_large = matches.is_present("big");
 | 
			
		||||
        let form = matches.value_of("form");
 | 
			
		||||
        show_pokemon_by_name(name, shiny, is_large, form);
 | 
			
		||||
    } else if matches.is_present("random") {
 | 
			
		||||
        let generation = matches.value_of("random");
 | 
			
		||||
        let shiny = matches.is_present("shiny");
 | 
			
		||||
        let is_large = matches.is_present("big");
 | 
			
		||||
        show_random_pokemon(generation, shiny, is_large);
 | 
			
		||||
    }
 | 
			
		||||
    // Handle other commands similarly
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
struct Pokemon {
 | 
			
		||||
    name: String,
 | 
			
		||||
    // Define other fields as needed
 | 
			
		||||
}
 | 
			
		||||
fn list_pokemon_names(filepath: &std::path::Path) -> std::io::Result<()> {
 | 
			
		||||
    let file = std::fs::File::open(filepath)?;
 | 
			
		||||
    let reader = std::io::BufReader::new(file);
 | 
			
		||||
    let pokemon_json: serde_json::Value = serde_json::from_reader(reader)?;
 | 
			
		||||
 | 
			
		||||
fn load_pokemon_data() -> Vec<Pokemon> {
 | 
			
		||||
    let path = Path::new("pokemon.json");
 | 
			
		||||
    let mut file = File::open(&path).expect("File not found");
 | 
			
		||||
    let mut contents = String::new();
 | 
			
		||||
    file.read_to_string(&mut contents)
 | 
			
		||||
        .expect("Failed to read file");
 | 
			
		||||
    let mut count = 0;
 | 
			
		||||
 | 
			
		||||
    serde_json::from_str(&contents).expect("Failed to parse JSON")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn list_pokemon_names() {
 | 
			
		||||
    let pokemon_list = load_pokemon_data();
 | 
			
		||||
    for pokemon in pokemon_list {
 | 
			
		||||
        println!("{}", pokemon.name);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn print_file(filepath: &str) {
 | 
			
		||||
    match fs::read_to_string(filepath) {
 | 
			
		||||
        Ok(contents) => println!("{}", contents),
 | 
			
		||||
        Err(e) => eprintln!("Error reading file: {}", e),
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn show_pokemon_by_name(name: &str, shiny: bool, is_large: bool, form: Option<&str>) {
 | 
			
		||||
    let color_subdir = if shiny { "shiny" } else { "regular" };
 | 
			
		||||
    let size_subdir = if is_large { "large" } else { "small" };
 | 
			
		||||
    let mut pokemon_name = name.to_string();
 | 
			
		||||
 | 
			
		||||
    if let Some(f) = form {
 | 
			
		||||
        pokemon_name.push_str("-");
 | 
			
		||||
        pokemon_name.push_str(f);
 | 
			
		||||
    if let serde_json::Value::Array(array) = pokemon_json {
 | 
			
		||||
        for pokemon in array {
 | 
			
		||||
            if let Some(name) = pokemon.get("name") {
 | 
			
		||||
                if let serde_json::Value::String(name_str) = name {
 | 
			
		||||
                    println!("{}", name_str);
 | 
			
		||||
                    count += 1;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let filepath = format!(
 | 
			
		||||
        "{}/{}/{}/{}",
 | 
			
		||||
        "path_to_colorscripts_dir", size_subdir, color_subdir, pokemon_name
 | 
			
		||||
    );
 | 
			
		||||
    println!("Total: {} Pokémons", count);
 | 
			
		||||
 | 
			
		||||
    println!("Showing: {}", pokemon_name);
 | 
			
		||||
    print_file(&filepath);
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn show_random_pokemon(generation: Option<&str>, shiny: bool, is_large: bool) {
 | 
			
		||||
    let pokemon_list = load_pokemon_data();
 | 
			
		||||
    // Simplified: Add logic to filter Pokémon based on the generation range
 | 
			
		||||
    let mut rng = thread_rng();
 | 
			
		||||
    let pokemon_index = rng.gen_range(0..pokemon_list.len());
 | 
			
		||||
    let pokemon_name = &pokemon_list[pokemon_index].name;
 | 
			
		||||
fn show_pokemon_by_name(
 | 
			
		||||
    name: &str,
 | 
			
		||||
    show_title: bool,
 | 
			
		||||
    shiny: bool,
 | 
			
		||||
    is_large: bool,
 | 
			
		||||
    form: Option<&str>,
 | 
			
		||||
) -> std::io::Result<()> {
 | 
			
		||||
    // set variables
 | 
			
		||||
    let base_path = COLORSCRIPTS_DIR;
 | 
			
		||||
    let color_subdir = if shiny { SHINY_SUBDIR } else { REGULAR_SUBDIR };
 | 
			
		||||
    let size_subdir = if is_large { LARGE_SUBDIR } else { SMALL_SUBDIR };
 | 
			
		||||
 | 
			
		||||
    // Determine shininess based on a random chance or if explicitly requested
 | 
			
		||||
    let is_shiny = if shiny {
 | 
			
		||||
        true
 | 
			
		||||
    let file = std::fs::File::open(PROGRAM_DIR.join("pokemon.json"))?;
 | 
			
		||||
    let reader = std::io::BufReader::new(file);
 | 
			
		||||
    let pokemon_json: serde_json::Value = serde_json::from_reader(reader)?;
 | 
			
		||||
 | 
			
		||||
    let pokemon_names: Vec<&str> = pokemon_json
 | 
			
		||||
        .as_array()
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .iter()
 | 
			
		||||
        .map(|pokemon| pokemon["name"].as_str().unwrap())
 | 
			
		||||
        .collect();
 | 
			
		||||
 | 
			
		||||
    if !pokemon_names.contains(&name) {
 | 
			
		||||
        println!("Invalid pokemon {}", name);
 | 
			
		||||
        std::process::exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let mut name = name.to_string();
 | 
			
		||||
 | 
			
		||||
    if let Some(form) = form {
 | 
			
		||||
        let forms: Vec<&str> = pokemon_json
 | 
			
		||||
            .as_array()
 | 
			
		||||
            .unwrap()
 | 
			
		||||
            .iter()
 | 
			
		||||
            .filter(|pokemon| pokemon["name"].as_str().unwrap() == name)
 | 
			
		||||
            .flat_map(|pokemon| pokemon["forms"].as_array().unwrap().iter())
 | 
			
		||||
            .map(|form| form.as_str().unwrap())
 | 
			
		||||
            .collect();
 | 
			
		||||
 | 
			
		||||
        let alternate_forms: Vec<&str> =
 | 
			
		||||
            forms.iter().filter(|&f| *f != "regular").cloned().collect();
 | 
			
		||||
 | 
			
		||||
        if alternate_forms.contains(&form) {
 | 
			
		||||
            name.push_str(&format!("-{}", form));
 | 
			
		||||
        } else {
 | 
			
		||||
            println!("Invalid form '{}' for pokemon {}", form, name);
 | 
			
		||||
            if alternate_forms.is_empty() {
 | 
			
		||||
                println!("No alternate forms available for {}", name);
 | 
			
		||||
            } else {
 | 
			
		||||
                println!("Available alternate forms are");
 | 
			
		||||
                for form in alternate_forms {
 | 
			
		||||
                    println!("- {}", form);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            std::process::exit(1);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let pokemon_file = base_path.join(size_subdir).join(color_subdir).join(&name);
 | 
			
		||||
 | 
			
		||||
    if show_title {
 | 
			
		||||
        if shiny {
 | 
			
		||||
            println!("{} (shiny)", name);
 | 
			
		||||
        } else {
 | 
			
		||||
            println!("{}", name);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    print_file(&pokemon_file)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn show_random_pokemon(
 | 
			
		||||
    generations: &str,
 | 
			
		||||
    show_title: bool,
 | 
			
		||||
    shiny: bool,
 | 
			
		||||
    is_large: bool,
 | 
			
		||||
) -> std::io::Result<()> {
 | 
			
		||||
    let mut rng = rand::thread_rng();
 | 
			
		||||
 | 
			
		||||
    let (start_gen, end_gen) = if generations.is_empty() {
 | 
			
		||||
        ("1", "8")
 | 
			
		||||
    } else if generations.contains(",") {
 | 
			
		||||
        let gens: Vec<&str> = generations.split(",").collect();
 | 
			
		||||
        let gen = gens[rng.gen_range(0..gens.len())];
 | 
			
		||||
        (gen, gen)
 | 
			
		||||
    } else if generations.contains("-") {
 | 
			
		||||
        let gens: Vec<&str> = generations.split("-").collect();
 | 
			
		||||
        (gens[0], gens[1])
 | 
			
		||||
    } else {
 | 
			
		||||
        rng.gen_bool(1.0 / 128.0)
 | 
			
		||||
        (generations, generations)
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    show_pokemon_by_name(pokemon_name, is_shiny, is_large, None);
 | 
			
		||||
    let file = std::fs::File::open(PROGRAM_DIR.join("pokemon.json"))?;
 | 
			
		||||
    let reader = std::io::BufReader::new(file);
 | 
			
		||||
    let pokemon_json: serde_json::Value = serde_json::from_reader(reader)?;
 | 
			
		||||
    let pokemon: Vec<String> = pokemon_json
 | 
			
		||||
        .as_array()
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .iter()
 | 
			
		||||
        .map(|p| p["name"].as_str().unwrap().to_string())
 | 
			
		||||
        .collect();
 | 
			
		||||
 | 
			
		||||
    let generations_map: std::collections::HashMap<_, _> = GENERATIONS.iter().cloned().collect();
 | 
			
		||||
 | 
			
		||||
    if let Some((start_idx, end_idx)) = generations_map.get(start_gen) {
 | 
			
		||||
        let random_idx = rng.gen_range(*start_idx..=*end_idx);
 | 
			
		||||
        let random_pokemon = &pokemon[random_idx as usize - 1];
 | 
			
		||||
        let shiny = if !shiny {
 | 
			
		||||
            rng.gen::<f64>() <= SHINY_RATE
 | 
			
		||||
        } else {
 | 
			
		||||
            shiny
 | 
			
		||||
        };
 | 
			
		||||
        show_pokemon_by_name(random_pokemon, show_title, shiny, is_large, None)?;
 | 
			
		||||
    } else {
 | 
			
		||||
        println!("Invalid generation '{}'", generations);
 | 
			
		||||
        std::process::exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn main() {
 | 
			
		||||
    // println!("{}", PROGRAM.display());
 | 
			
		||||
    // println!("{}", PROGRAM_DIR.display());
 | 
			
		||||
    // println!("{}", COLORSCRIPTS_DIR.display());
 | 
			
		||||
    // show_pokemon_by_name("eevee", false, false, false, Some("gmax")).unwrap();
 | 
			
		||||
    show_random_pokemon("1-999", true, false, false);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue