This commit is contained in:
Vomitblood 2024-03-24 22:43:39 +08:00
parent 33691e38df
commit 2893bdfe62
3 changed files with 192 additions and 17 deletions

100
Cargo.lock generated
View file

@ -2,12 +2,53 @@
# It is not intended for manual editing. # It is not intended for manual editing.
version = 3 version = 3
[[package]]
name = "ansi_term"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
dependencies = [
"winapi",
]
[[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 = "bitflags"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]] [[package]]
name = "cfg-if" name = "cfg-if"
version = "1.0.0" version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "clap"
version = "2.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
dependencies = [
"ansi_term",
"atty",
"bitflags",
"strsim",
"textwrap",
"unicode-width",
"vec_map",
]
[[package]] [[package]]
name = "getrandom" name = "getrandom"
version = "0.2.12" version = "0.2.12"
@ -19,6 +60,15 @@ dependencies = [
"wasi", "wasi",
] ]
[[package]]
name = "hermit-abi"
version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "itoa" name = "itoa"
version = "1.0.10" version = "1.0.10"
@ -41,6 +91,7 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
name = "pokerust" name = "pokerust"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"clap",
"once_cell", "once_cell",
"rand", "rand",
"serde", "serde",
@ -138,6 +189,12 @@ dependencies = [
"serde", "serde",
] ]
[[package]]
name = "strsim"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.55" version = "2.0.55"
@ -149,14 +206,57 @@ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]]
name = "textwrap"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
dependencies = [
"unicode-width",
]
[[package]] [[package]]
name = "unicode-ident" name = "unicode-ident"
version = "1.0.12" version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
[[package]]
name = "unicode-width"
version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85"
[[package]]
name = "vec_map"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
[[package]] [[package]]
name = "wasi" name = "wasi"
version = "0.11.0+wasi-snapshot-preview1" version = "0.11.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 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-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"

View file

@ -10,3 +10,4 @@ rand = "0.8"
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0" serde_json = "1.0"
once_cell = "1.8.0" once_cell = "1.8.0"
clap = { version = "2" }

View file

@ -2,9 +2,6 @@ use rand::Rng;
use std::io::prelude::*; use std::io::prelude::*;
// set global constants // set global constants
const PROGRAM: once_cell::sync::Lazy<std::path::PathBuf> =
once_cell::sync::Lazy::new(|| std::env::current_exe().unwrap());
const PROGRAM_DIR: once_cell::sync::Lazy<std::path::PathBuf> = once_cell::sync::Lazy::new(|| { 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()) std::path::PathBuf::from(std::env::current_exe().unwrap().parent().unwrap())
}); });
@ -12,6 +9,9 @@ const PROGRAM_DIR: once_cell::sync::Lazy<std::path::PathBuf> = once_cell::sync::
const COLORSCRIPTS_DIR: once_cell::sync::Lazy<std::path::PathBuf> = const COLORSCRIPTS_DIR: once_cell::sync::Lazy<std::path::PathBuf> =
once_cell::sync::Lazy::new(|| PROGRAM_DIR.join("colorscripts")); once_cell::sync::Lazy::new(|| PROGRAM_DIR.join("colorscripts"));
const POKEMON_DATA_PATH: once_cell::sync::Lazy<std::path::PathBuf> =
once_cell::sync::Lazy::new(|| PROGRAM_DIR.join("pokemon.json"));
const REGULAR_SUBDIR: &str = "regular"; const REGULAR_SUBDIR: &str = "regular";
const SHINY_SUBDIR: &str = "shiny"; const SHINY_SUBDIR: &str = "shiny";
@ -42,8 +42,8 @@ fn print_file(filepath: &std::path::Path) -> std::io::Result<()> {
Ok(()) Ok(())
} }
fn list_pokemon_names(filepath: &std::path::Path) -> std::io::Result<()> { fn list_pokemon_names() -> std::io::Result<()> {
let file = std::fs::File::open(filepath)?; let file = std::fs::File::open(POKEMON_DATA_PATH.as_path())?;
let reader = std::io::BufReader::new(file); let reader = std::io::BufReader::new(file);
let pokemon_json: serde_json::Value = serde_json::from_reader(reader)?; let pokemon_json: serde_json::Value = serde_json::from_reader(reader)?;
@ -77,7 +77,7 @@ fn show_pokemon_by_name(
let color_subdir = if shiny { SHINY_SUBDIR } else { REGULAR_SUBDIR }; let color_subdir = if shiny { SHINY_SUBDIR } else { REGULAR_SUBDIR };
let size_subdir = if is_large { LARGE_SUBDIR } else { SMALL_SUBDIR }; let size_subdir = if is_large { LARGE_SUBDIR } else { SMALL_SUBDIR };
let file = std::fs::File::open(PROGRAM_DIR.join("pokemon.json"))?; let file = std::fs::File::open(POKEMON_DATA_PATH.as_path())?;
let reader = std::io::BufReader::new(file); let reader = std::io::BufReader::new(file);
let pokemon_json: serde_json::Value = serde_json::from_reader(reader)?; let pokemon_json: serde_json::Value = serde_json::from_reader(reader)?;
@ -145,20 +145,20 @@ fn show_random_pokemon(
) -> std::io::Result<()> { ) -> std::io::Result<()> {
let mut rng = rand::thread_rng(); let mut rng = rand::thread_rng();
let (start_gen, end_gen) = if generations.is_empty() { let start_gen = if generations.is_empty() {
("1", "8") "1"
} else if generations.contains(",") { } else if generations.contains(",") {
let gens: Vec<&str> = generations.split(",").collect(); let gens: Vec<&str> = generations.split(",").collect();
let gen = gens[rng.gen_range(0..gens.len())]; let gen = gens[rng.gen_range(0..gens.len())];
(gen, gen) gen
} else if generations.contains("-") { } else if generations.contains("-") {
let gens: Vec<&str> = generations.split("-").collect(); let gens: Vec<&str> = generations.split("-").collect();
(gens[0], gens[1]) gens[0]
} else { } else {
(generations, generations) generations
}; };
let file = std::fs::File::open(PROGRAM_DIR.join("pokemon.json"))?; let file = std::fs::File::open(POKEMON_DATA_PATH.as_path())?;
let reader = std::io::BufReader::new(file); let reader = std::io::BufReader::new(file);
let pokemon_json: serde_json::Value = serde_json::from_reader(reader)?; let pokemon_json: serde_json::Value = serde_json::from_reader(reader)?;
let pokemon: Vec<String> = pokemon_json let pokemon: Vec<String> = pokemon_json
@ -187,10 +187,84 @@ fn show_random_pokemon(
Ok(()) 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("7-8", true, false, false);
// list_pokemon_names();
// }
fn main() { fn main() {
// println!("{}", PROGRAM.display()); let matches = clap::App::new("pokemon-colorscripts")
// println!("{}", PROGRAM_DIR.display()); .about("CLI utility to print out unicode image of a pokemon in your shell")
// println!("{}", COLORSCRIPTS_DIR.display()); .arg(
// show_pokemon_by_name("eevee", false, false, false, Some("gmax")).unwrap(); clap::Arg::with_name("list")
show_random_pokemon("1-999", true, false, false); .short("l")
.long("list")
.help("Print list of all pokemon"),
)
.arg(
clap::Arg::with_name("name")
.short("n")
.long("name")
.value_name("POKEMON NAME")
.help("Select pokemon by name. Generally spelled like in the games."),
)
.arg(
clap::Arg::with_name("form")
.short("f")
.long("form")
.value_name("FORM")
.help("Show an alternate form of a pokemon"),
)
.arg(
clap::Arg::with_name("no-title")
.long("no-title")
.help("Do not display pokemon name"),
)
.arg(
clap::Arg::with_name("shiny")
.short("s")
.long("shiny")
.help("Show the shiny version of the pokemon instead"),
)
.arg(
clap::Arg::with_name("big")
.short("b")
.long("big")
.help("Show a larger version of the sprite"),
)
.arg(
clap::Arg::with_name("random")
.short("r")
.long("random")
.value_name("GENERATION")
.help("Show a random pokemon. This flag can optionally be followed by a generation number or range (1-8) to show random pokemon from a specific generation or range of generations. The generations can be provided as a continuous range (eg. 1-3) or as a list of generations (1,3,6)"),
)
.get_matches();
if matches.is_present("list") {
list_pokemon_names().unwrap();
} else if matches.is_present("name") {
let name = matches.value_of("name").unwrap();
let no_title = matches.is_present("no-title");
let shiny = matches.is_present("shiny");
let big = matches.is_present("big");
let form = matches.value_of("form");
show_pokemon_by_name(name, no_title, shiny, big, form).unwrap();
} else if matches.is_present("random") {
let random = matches.value_of("random").unwrap_or("");
let no_title = matches.is_present("no-title");
let shiny = matches.is_present("shiny");
let big = matches.is_present("big");
if matches.is_present("form") {
println!("--form flag unexpected with --random");
std::process::exit(1);
}
show_random_pokemon(random, no_title, shiny, big).unwrap();
} else {
show_random_pokemon("", true, false, false).unwrap();
}
} }