cleaned up flags
This commit is contained in:
parent
9156ff8709
commit
68ad9c816b
155
Cargo.lock
generated
155
Cargo.lock
generated
|
@ -34,54 +34,6 @@ version = "0.5.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1"
|
checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "anstream"
|
|
||||||
version = "0.6.13"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb"
|
|
||||||
dependencies = [
|
|
||||||
"anstyle",
|
|
||||||
"anstyle-parse",
|
|
||||||
"anstyle-query",
|
|
||||||
"anstyle-wincon",
|
|
||||||
"colorchoice",
|
|
||||||
"utf8parse",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "anstyle"
|
|
||||||
version = "1.0.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "anstyle-parse"
|
|
||||||
version = "0.2.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c"
|
|
||||||
dependencies = [
|
|
||||||
"utf8parse",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "anstyle-query"
|
|
||||||
version = "1.0.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648"
|
|
||||||
dependencies = [
|
|
||||||
"windows-sys 0.52.0",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "anstyle-wincon"
|
|
||||||
version = "3.0.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7"
|
|
||||||
dependencies = [
|
|
||||||
"anstyle",
|
|
||||||
"windows-sys 0.52.0",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anyhow"
|
name = "anyhow"
|
||||||
version = "1.0.82"
|
version = "1.0.82"
|
||||||
|
@ -111,6 +63,17 @@ version = "0.7.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
|
checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
|
||||||
|
|
||||||
|
[[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]]
|
[[package]]
|
||||||
name = "autocfg"
|
name = "autocfg"
|
||||||
version = "1.2.0"
|
version = "1.2.0"
|
||||||
|
@ -301,30 +264,28 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap"
|
name = "clap"
|
||||||
version = "4.5.4"
|
version = "3.2.25"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0"
|
checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap_builder",
|
"atty",
|
||||||
]
|
"bitflags 1.3.2",
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "clap_builder"
|
|
||||||
version = "4.5.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4"
|
|
||||||
dependencies = [
|
|
||||||
"anstream",
|
|
||||||
"anstyle",
|
|
||||||
"clap_lex",
|
"clap_lex",
|
||||||
|
"indexmap 1.9.3",
|
||||||
|
"once_cell",
|
||||||
"strsim",
|
"strsim",
|
||||||
|
"termcolor",
|
||||||
|
"textwrap",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap_lex"
|
name = "clap_lex"
|
||||||
version = "0.7.0"
|
version = "0.2.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce"
|
checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5"
|
||||||
|
dependencies = [
|
||||||
|
"os_str_bytes",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "color_quant"
|
name = "color_quant"
|
||||||
|
@ -332,12 +293,6 @@ version = "1.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
|
checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "colorchoice"
|
|
||||||
version = "1.0.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "constant_time_eq"
|
name = "constant_time_eq"
|
||||||
version = "0.1.5"
|
version = "0.1.5"
|
||||||
|
@ -703,7 +658,7 @@ dependencies = [
|
||||||
"futures-sink",
|
"futures-sink",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"http",
|
"http",
|
||||||
"indexmap",
|
"indexmap 2.2.6",
|
||||||
"slab",
|
"slab",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-util",
|
"tokio-util",
|
||||||
|
@ -720,6 +675,12 @@ dependencies = [
|
||||||
"crunchy",
|
"crunchy",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hashbrown"
|
||||||
|
version = "0.12.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hashbrown"
|
name = "hashbrown"
|
||||||
version = "0.14.3"
|
version = "0.14.3"
|
||||||
|
@ -732,6 +693,15 @@ version = "0.5.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
||||||
|
|
||||||
|
[[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 = "hmac"
|
name = "hmac"
|
||||||
version = "0.12.1"
|
version = "0.12.1"
|
||||||
|
@ -861,6 +831,16 @@ version = "1.10.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126"
|
checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "indexmap"
|
||||||
|
version = "1.9.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
|
||||||
|
dependencies = [
|
||||||
|
"autocfg",
|
||||||
|
"hashbrown 0.12.3",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "indexmap"
|
name = "indexmap"
|
||||||
version = "2.2.6"
|
version = "2.2.6"
|
||||||
|
@ -868,7 +848,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
|
checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"equivalent",
|
"equivalent",
|
||||||
"hashbrown",
|
"hashbrown 0.14.3",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1231,6 +1211,12 @@ version = "0.2.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
|
checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "os_str_bytes"
|
||||||
|
version = "6.6.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "parking_lot"
|
name = "parking_lot"
|
||||||
version = "0.12.1"
|
version = "0.12.1"
|
||||||
|
@ -1841,9 +1827,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "strsim"
|
name = "strsim"
|
||||||
version = "0.11.1"
|
version = "0.10.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
|
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "subtle"
|
name = "subtle"
|
||||||
|
@ -1920,6 +1906,21 @@ dependencies = [
|
||||||
"windows-sys 0.52.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[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]]
|
[[package]]
|
||||||
name = "thiserror"
|
name = "thiserror"
|
||||||
version = "1.0.58"
|
version = "1.0.58"
|
||||||
|
@ -2051,7 +2052,7 @@ version = "0.22.12"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef"
|
checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"indexmap",
|
"indexmap 2.2.6",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_spanned",
|
"serde_spanned",
|
||||||
"toml_datetime",
|
"toml_datetime",
|
||||||
|
@ -2127,12 +2128,6 @@ dependencies = [
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "utf8parse"
|
|
||||||
version = "0.2.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "v_frame"
|
name = "v_frame"
|
||||||
version = "0.3.8"
|
version = "0.3.8"
|
||||||
|
|
|
@ -4,7 +4,7 @@ version = "0.1.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
clap = { version = "4.5.4", features = ["cargo"] }
|
clap = { version = "3.2.22", features = ["cargo"] }
|
||||||
crossterm = "0.27.0"
|
crossterm = "0.27.0"
|
||||||
ctrlc = "3.4.4"
|
ctrlc = "3.4.4"
|
||||||
dirs = "5.0.1"
|
dirs = "5.0.1"
|
||||||
|
|
55
src/fetch.rs
55
src/fetch.rs
|
@ -82,11 +82,10 @@ pub fn fetch(extract_destination: &std::path::Path, verbose: bool) {
|
||||||
};
|
};
|
||||||
|
|
||||||
// cleanup
|
// cleanup
|
||||||
// TODO: uncomment
|
match cleanup() {
|
||||||
// match cleanup() {
|
Ok(_) => (),
|
||||||
// Ok(_) => (),
|
Err(e) => eprintln!("Error cleaning up: {}", e),
|
||||||
// Err(e) => eprintln!("Error cleaning up: {}", e),
|
};
|
||||||
// };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create_working_directory() -> std::io::Result<()> {
|
fn create_working_directory() -> std::io::Result<()> {
|
||||||
|
@ -159,42 +158,6 @@ fn fetch_pokemon_json() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(serde::Serialize, serde::Deserialize, Debug)]
|
|
||||||
struct Slug {
|
|
||||||
eng: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(serde::Serialize, serde::Deserialize, Debug)]
|
|
||||||
struct Forms {
|
|
||||||
// ignoring actual details in the forms and just capturing form names
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(serde::Serialize, serde::Deserialize, Debug)]
|
|
||||||
struct Generation {
|
|
||||||
forms: std::collections::HashMap<String, Forms>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(serde::Serialize, serde::Deserialize, Debug)]
|
|
||||||
struct Pokemon {
|
|
||||||
idx: String,
|
|
||||||
slug: Slug,
|
|
||||||
#[serde(rename = "gen-8")]
|
|
||||||
gen_8: Generation,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(serde::Serialize, serde::Deserialize, Debug)]
|
|
||||||
struct PokemonCollection {
|
|
||||||
#[serde(flatten)]
|
|
||||||
entries: std::collections::HashMap<String, Pokemon>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(serde::Serialize, Debug)]
|
|
||||||
struct ProcessedPokemon {
|
|
||||||
pokedex: String,
|
|
||||||
name: String,
|
|
||||||
forms: Vec<String>,
|
|
||||||
}
|
|
||||||
|
|
||||||
fn process_pokemon_json(
|
fn process_pokemon_json(
|
||||||
output_directory_path: &std::path::Path,
|
output_directory_path: &std::path::Path,
|
||||||
) -> Result<(), Box<dyn std::error::Error>> {
|
) -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
@ -222,7 +185,7 @@ fn process_pokemon_json(
|
||||||
|
|
||||||
fn read_pokemon_file(
|
fn read_pokemon_file(
|
||||||
file_path: &std::path::Path,
|
file_path: &std::path::Path,
|
||||||
) -> Result<PokemonCollection, Box<dyn std::error::Error>> {
|
) -> Result<crate::structs::PokemonRawCollection, Box<dyn std::error::Error>> {
|
||||||
// open the file in read only mode
|
// open the file in read only mode
|
||||||
let file = std::fs::File::open(file_path)?;
|
let file = std::fs::File::open(file_path)?;
|
||||||
let reader = std::io::BufReader::new(file);
|
let reader = std::io::BufReader::new(file);
|
||||||
|
@ -234,9 +197,9 @@ fn read_pokemon_file(
|
||||||
}
|
}
|
||||||
|
|
||||||
fn transform_pokemon_data(
|
fn transform_pokemon_data(
|
||||||
pokemon_collection: &std::collections::HashMap<String, Pokemon>,
|
pokemon_collection: &std::collections::HashMap<String, crate::structs::PokemonRaw>,
|
||||||
) -> Vec<ProcessedPokemon> {
|
) -> Vec<crate::structs::Pokemon> {
|
||||||
let mut processed_pokemons: Vec<ProcessedPokemon> = pokemon_collection
|
let mut processed_pokemons: Vec<crate::structs::Pokemon> = pokemon_collection
|
||||||
.iter()
|
.iter()
|
||||||
.map(|(_key, p)| {
|
.map(|(_key, p)| {
|
||||||
let mut forms = p
|
let mut forms = p
|
||||||
|
@ -257,7 +220,7 @@ fn transform_pokemon_data(
|
||||||
forms.insert(0, "regular".to_string());
|
forms.insert(0, "regular".to_string());
|
||||||
}
|
}
|
||||||
|
|
||||||
ProcessedPokemon {
|
crate::structs::Pokemon {
|
||||||
// remove leading zeros from the pokedex number
|
// remove leading zeros from the pokedex number
|
||||||
pokedex: p.idx.trim_start_matches('0').to_string(),
|
pokedex: p.idx.trim_start_matches('0').to_string(),
|
||||||
// use the slug as the name
|
// use the slug as the name
|
||||||
|
|
|
@ -2,3 +2,5 @@ pub mod constants;
|
||||||
pub mod fetch;
|
pub mod fetch;
|
||||||
pub mod list;
|
pub mod list;
|
||||||
pub mod print;
|
pub mod print;
|
||||||
|
pub mod structs;
|
||||||
|
pub mod validation;
|
||||||
|
|
19
src/list.rs
19
src/list.rs
|
@ -1,15 +1,3 @@
|
||||||
#[derive(serde::Serialize, serde::Deserialize, Debug)]
|
|
||||||
struct Pokemon {
|
|
||||||
pokedex: String,
|
|
||||||
name: String,
|
|
||||||
forms: Vec<String>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(serde::Serialize, serde::Deserialize, Debug)]
|
|
||||||
struct PokemonList {
|
|
||||||
pokemons: Vec<Pokemon>,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn print_pokemon_list() -> Result<(), serde_json::Error> {
|
pub fn print_pokemon_list() -> Result<(), serde_json::Error> {
|
||||||
// open the file in read only mode with buffer
|
// open the file in read only mode with buffer
|
||||||
let file = std::fs::File::open(crate::constants::DATA_DIRECTORY.join("pokemon.json"))
|
let file = std::fs::File::open(crate::constants::DATA_DIRECTORY.join("pokemon.json"))
|
||||||
|
@ -17,7 +5,7 @@ pub fn print_pokemon_list() -> Result<(), serde_json::Error> {
|
||||||
let reader = std::io::BufReader::new(file);
|
let reader = std::io::BufReader::new(file);
|
||||||
|
|
||||||
// parse json into pokemonlist struct
|
// parse json into pokemonlist struct
|
||||||
let pokemon_list: Vec<Pokemon> = serde_json::from_reader(reader)?;
|
let pokemon_list: Vec<crate::structs::Pokemon> = serde_json::from_reader(reader)?;
|
||||||
|
|
||||||
// iterate through the vector and print the pokedex and name
|
// iterate through the vector and print the pokedex and name
|
||||||
for pokemon in pokemon_list {
|
for pokemon in pokemon_list {
|
||||||
|
@ -35,7 +23,8 @@ pub fn print_pokemon_forms(pokemon_name: &str) -> std::io::Result<()> {
|
||||||
let reader = std::io::BufReader::new(file);
|
let reader = std::io::BufReader::new(file);
|
||||||
|
|
||||||
// parse json into pokemonlist struct
|
// parse json into pokemonlist struct
|
||||||
let pokemon_list: Vec<Pokemon> = serde_json::from_reader(reader).expect("Failed to parse JSON");
|
let pokemon_list: Vec<crate::structs::Pokemon> =
|
||||||
|
serde_json::from_reader(reader).expect("Failed to parse JSON");
|
||||||
|
|
||||||
// iterate through the list to find the specified pokemon and print its forms
|
// iterate through the list to find the specified pokemon and print its forms
|
||||||
let mut found = false;
|
let mut found = false;
|
||||||
|
@ -54,6 +43,8 @@ pub fn print_pokemon_forms(pokemon_name: &str) -> std::io::Result<()> {
|
||||||
if !found {
|
if !found {
|
||||||
println!("No Pokemon found with the name '{}'.", pokemon_name);
|
println!("No Pokemon found with the name '{}'.", pokemon_name);
|
||||||
println!("Hint: Do `rustmon list` to see all available Pokemon.")
|
println!("Hint: Do `rustmon list` to see all available Pokemon.")
|
||||||
|
} else {
|
||||||
|
println!("\nHint: Pass in `--form` when using subcommand `print` to see the specific form of a Pokemon!");
|
||||||
}
|
}
|
||||||
|
|
||||||
return Ok(());
|
return Ok(());
|
||||||
|
|
68
src/main.rs
68
src/main.rs
|
@ -13,7 +13,7 @@
|
||||||
- `no-title` - Do not print Pokemon name
|
- `no-title` - Do not print Pokemon name
|
||||||
- `pokedex` - Print Pokemon by Pokedex number
|
- `pokedex` - Print Pokemon by Pokedex number
|
||||||
- `random` - Print a random Pokemon colorscript
|
- `random` - Print a random Pokemon colorscript
|
||||||
- `shiny` - Print the shiny version of the colorscript
|
- `shiny` - Rate of printing the shiny version of the colorscript
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/// Pokemon Colorscripts written in Rust
|
/// Pokemon Colorscripts written in Rust
|
||||||
|
@ -34,6 +34,11 @@ fn main() {
|
||||||
// invoke bigchungus fetch function
|
// invoke bigchungus fetch function
|
||||||
rustmon::fetch::fetch(extract_destination, verbose)
|
rustmon::fetch::fetch(extract_destination, verbose)
|
||||||
} else if let Some(list_args) = args.subcommand_matches("list") {
|
} else if let Some(list_args) = args.subcommand_matches("list") {
|
||||||
|
// list
|
||||||
|
|
||||||
|
// validate files first
|
||||||
|
rustmon::validation::validate_files();
|
||||||
|
|
||||||
let pokemon_name: &String = list_args.get_one::<String>("forms").unwrap();
|
let pokemon_name: &String = list_args.get_one::<String>("forms").unwrap();
|
||||||
if pokemon_name.is_empty() {
|
if pokemon_name.is_empty() {
|
||||||
// list
|
// list
|
||||||
|
@ -56,22 +61,19 @@ fn main() {
|
||||||
}
|
}
|
||||||
} else if let Some(print_args) = args.subcommand_matches("print") {
|
} else if let Some(print_args) = args.subcommand_matches("print") {
|
||||||
// print
|
// print
|
||||||
|
|
||||||
|
// validate files first
|
||||||
|
rustmon::validation::validate_files();
|
||||||
|
|
||||||
// declare and define variables from arguments
|
// declare and define variables from arguments
|
||||||
let big: bool = print_args.get_flag("big");
|
let big = print_args.get_flag("big");
|
||||||
let id = print_args.get_one::<String>("id").unwrap();
|
let pokedex: u16 = *print_args.get_one::<u16>("pokedex").unwrap();
|
||||||
let name = print_args.get_one::<String>("name").unwrap();
|
let name: &String = print_args.get_one::<String>("name").unwrap();
|
||||||
let no_title: bool = print_args.get_flag("no-title");
|
let no_title: bool = print_args.get_flag("no-title");
|
||||||
let random: bool = print_args.get_flag("random");
|
let random: bool = print_args.get_flag("random");
|
||||||
let shiny: bool = print_args.get_flag("shiny");
|
let shiny: f32 = *print_args.get_one::<f32>("shiny").unwrap();
|
||||||
|
|
||||||
println!("Big: {}", big);
|
rustmon::print::print(big, pokedex, name, no_title, random, shiny);
|
||||||
println!("ID: {}", id);
|
|
||||||
println!("Name: {}", name);
|
|
||||||
println!("No title: {}", no_title);
|
|
||||||
println!("Random: {}", random);
|
|
||||||
println!("Shiny: {}", shiny);
|
|
||||||
|
|
||||||
rustmon::print::print();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,7 +113,8 @@ fn argument_parser() -> clap::ArgMatches {
|
||||||
.help("Print a list of forms of the specified Pokemon")
|
.help("Print a list of forms of the specified Pokemon")
|
||||||
.short('f')
|
.short('f')
|
||||||
.long("forms")
|
.long("forms")
|
||||||
.default_value(""),
|
.default_value("")
|
||||||
|
.hide_default_value(true),
|
||||||
)
|
)
|
||||||
.after_help(
|
.after_help(
|
||||||
"Tip: Use `grep` to search for a specific Pokemon form!
|
"Tip: Use `grep` to search for a specific Pokemon form!
|
||||||
|
@ -124,21 +127,24 @@ For more advanced usage, use `less` or `more` to scroll through the list!",
|
||||||
clap::Command::new("print")
|
clap::Command::new("print")
|
||||||
.about("Print a Pokemon colorscript")
|
.about("Print a Pokemon colorscript")
|
||||||
// print/big
|
// print/big
|
||||||
.arg(clap::arg!(-b --big "Print a bigger version of the colorscript"))
|
.arg(
|
||||||
|
clap::Arg::new("big")
|
||||||
|
.help("Print a bigger version of the colorscript")
|
||||||
|
.short('b')
|
||||||
|
.long("big")
|
||||||
|
.action(clap::ArgAction::SetTrue),
|
||||||
|
)
|
||||||
// print/name
|
// print/name
|
||||||
.arg(
|
.arg(
|
||||||
clap::Arg::new("name")
|
clap::Arg::new("name")
|
||||||
.help("Print Pokemon by name")
|
.help("Print Pokemon by name")
|
||||||
.short('n')
|
.short('n')
|
||||||
.long("name")
|
.long("name")
|
||||||
|
.default_value("")
|
||||||
|
.hide_default_value(true)
|
||||||
.conflicts_with("pokedex")
|
.conflicts_with("pokedex")
|
||||||
.conflicts_with("random"),
|
.conflicts_with("random"),
|
||||||
)
|
)
|
||||||
// print/random
|
|
||||||
.arg(
|
|
||||||
clap::arg!(-r --random "Print a random Pokemon colorscript")
|
|
||||||
.conflicts_with("name"),
|
|
||||||
)
|
|
||||||
// print/no-title
|
// print/no-title
|
||||||
.arg(
|
.arg(
|
||||||
clap::Arg::new("no-title")
|
clap::Arg::new("no-title")
|
||||||
|
@ -146,17 +152,37 @@ For more advanced usage, use `less` or `more` to scroll through the list!",
|
||||||
.long("no-title")
|
.long("no-title")
|
||||||
.action(clap::ArgAction::SetTrue),
|
.action(clap::ArgAction::SetTrue),
|
||||||
)
|
)
|
||||||
|
// print/random
|
||||||
|
.arg(
|
||||||
|
clap::Arg::new("random")
|
||||||
|
.help("Print a random Pokemon colorscript")
|
||||||
|
.short('r')
|
||||||
|
.long("random")
|
||||||
|
.action(clap::ArgAction::SetTrue),
|
||||||
|
)
|
||||||
// print/pokedex
|
// print/pokedex
|
||||||
.arg(
|
.arg(
|
||||||
clap::Arg::new("pokedex")
|
clap::Arg::new("pokedex")
|
||||||
.help("Print Pokemon by Pokedex number")
|
.help("Print Pokemon by Pokedex number")
|
||||||
.short('p')
|
.short('p')
|
||||||
.long("pokedex")
|
.long("pokedex")
|
||||||
|
.value_parser(clap::value_parser!(u16).range(0..))
|
||||||
|
.default_value("0")
|
||||||
|
.hide_default_value(true)
|
||||||
.conflicts_with("name")
|
.conflicts_with("name")
|
||||||
.conflicts_with("random"),
|
.conflicts_with("random"),
|
||||||
)
|
)
|
||||||
// print/shiny
|
// print/shiny
|
||||||
.arg(clap::arg!(-s --shiny "Print the shiny version of the colorscript")),
|
.arg(
|
||||||
|
clap::Arg::new("shiny")
|
||||||
|
.help(
|
||||||
|
"Rate of printing the shiny version of the colorscript (e.g. 0.10 for 10% chance)",
|
||||||
|
)
|
||||||
|
.short('s')
|
||||||
|
.long("shiny")
|
||||||
|
.value_parser(clap::value_parser!(f32))
|
||||||
|
.default_value("0.10"),
|
||||||
|
),
|
||||||
)
|
)
|
||||||
// finalize
|
// finalize
|
||||||
.get_matches();
|
.get_matches();
|
||||||
|
|
50
src/print.rs
50
src/print.rs
|
@ -1,3 +1,49 @@
|
||||||
pub fn print() {
|
use std::io::Read;
|
||||||
println!("Hello, world!");
|
|
||||||
|
pub fn print(big: bool, pokedex: u16, name: &String, no_title: bool, random: bool, shiny: f32) {
|
||||||
|
println!("Big: {}", big);
|
||||||
|
println!("pokedex: {}", pokedex);
|
||||||
|
println!("Name: {}", name);
|
||||||
|
println!("No title: {}", no_title);
|
||||||
|
println!("Random: {}", random);
|
||||||
|
println!("Shiny: {}", shiny);
|
||||||
|
|
||||||
|
// decide which function to call
|
||||||
|
// random, by pokedex or by name
|
||||||
|
if random {
|
||||||
|
// random
|
||||||
|
println!("Random");
|
||||||
|
} else if pokedex > 0 {
|
||||||
|
// by pokedex
|
||||||
|
println!("By pokedex");
|
||||||
|
} else {
|
||||||
|
// by name
|
||||||
|
println!("By name");
|
||||||
|
}
|
||||||
|
|
||||||
|
match find_pokemon_by_pokedex(&pokedex.to_string()) {
|
||||||
|
Ok(pokemon_name) => println!("Found Pokémon: {}", pokemon_name),
|
||||||
|
Err(e) => eprintln!("Error: {}", e),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn find_pokemon_by_pokedex(pokedex_number: &str) -> Result<String, Box<dyn std::error::Error>> {
|
||||||
|
// read the file
|
||||||
|
let mut file = std::fs::File::open(crate::constants::DATA_DIRECTORY.join("pokemon.json"))?;
|
||||||
|
let mut contents = String::new();
|
||||||
|
file.read_to_string(&mut contents)?;
|
||||||
|
|
||||||
|
// deserialize into the struct
|
||||||
|
let pokemons: Vec<crate::structs::Pokemon> = serde_json::from_str(&contents)?;
|
||||||
|
|
||||||
|
// iterate through the list to find the specified pokemon
|
||||||
|
for pokemon in pokemons {
|
||||||
|
if pokemon.pokedex == pokedex_number {
|
||||||
|
// if found then return the name
|
||||||
|
return Ok(pokemon.name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if not found the return an error
|
||||||
|
return Err("Pokemon not found".into());
|
||||||
}
|
}
|
||||||
|
|
40
src/structs.rs
Normal file
40
src/structs.rs
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
#[derive(serde::Serialize, serde::Deserialize, Debug)]
|
||||||
|
pub struct Slug {
|
||||||
|
pub eng: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(serde::Serialize, serde::Deserialize, Debug)]
|
||||||
|
pub struct Forms {
|
||||||
|
// ignoring actual details in the forms and just capturing form names
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(serde::Serialize, serde::Deserialize, Debug)]
|
||||||
|
pub struct Generation {
|
||||||
|
pub forms: std::collections::HashMap<String, Forms>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(serde::Serialize, serde::Deserialize, Debug)]
|
||||||
|
pub struct PokemonRaw {
|
||||||
|
pub idx: String,
|
||||||
|
pub slug: Slug,
|
||||||
|
#[serde(rename = "gen-8")]
|
||||||
|
pub gen_8: Generation,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(serde::Serialize, serde::Deserialize, Debug)]
|
||||||
|
pub struct PokemonRawCollection {
|
||||||
|
#[serde(flatten)]
|
||||||
|
pub entries: std::collections::HashMap<String, PokemonRaw>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(serde::Serialize, serde::Deserialize, Debug)]
|
||||||
|
pub struct Pokemon {
|
||||||
|
pub pokedex: String,
|
||||||
|
pub name: String,
|
||||||
|
pub forms: Vec<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(serde::Serialize, serde::Deserialize, Debug)]
|
||||||
|
pub struct PokemonCollection {
|
||||||
|
pub pokemons: Vec<Pokemon>,
|
||||||
|
}
|
64
src/validation.rs
Normal file
64
src/validation.rs
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
pub fn validate_files() {
|
||||||
|
match validate_pokemon_json() {
|
||||||
|
Ok(_) => {}
|
||||||
|
Err(e) => {
|
||||||
|
eprintln!("Error: {}", e);
|
||||||
|
std::process::exit(1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
match validate_colorscripts_directory() {
|
||||||
|
Ok(_) => {}
|
||||||
|
Err(e) => {
|
||||||
|
eprintln!("Error: {}", e);
|
||||||
|
std::process::exit(1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn validate_pokemon_json() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
let file_path: std::path::PathBuf = crate::constants::DATA_DIRECTORY.join("pokemon.json");
|
||||||
|
|
||||||
|
// check if pokemon.json exists
|
||||||
|
if !crate::constants::DATA_DIRECTORY
|
||||||
|
.join("pokemon.json")
|
||||||
|
.exists()
|
||||||
|
{
|
||||||
|
return Err("`pokemon.json` does not exist. Please run the `fetch` subcommand.".into());
|
||||||
|
}
|
||||||
|
|
||||||
|
// open pokemon.json in read only mode
|
||||||
|
let file = std::fs::File::open(file_path)?;
|
||||||
|
let reader = std::io::BufReader::new(file);
|
||||||
|
|
||||||
|
// try to parse the json into an array of pokemons struct
|
||||||
|
let pokemon_data: Result<Vec<crate::structs::Pokemon>, serde_json::Error> =
|
||||||
|
serde_json::from_reader(reader);
|
||||||
|
|
||||||
|
match pokemon_data {
|
||||||
|
Ok(_) => return Ok(()),
|
||||||
|
Err(_) => {
|
||||||
|
return Err(format!(
|
||||||
|
"JSON structure is not correct. Please run the `fetch` subcommand."
|
||||||
|
)
|
||||||
|
.into())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn validate_colorscripts_directory() -> Result<(), String> {
|
||||||
|
let base_path: std::path::PathBuf = crate::constants::DATA_DIRECTORY.join("colorscripts");
|
||||||
|
|
||||||
|
let subdirectories = ["big/regular", "big/shiny", "small/regular", "small/shiny"];
|
||||||
|
|
||||||
|
for subdirectory in subdirectories.iter() {
|
||||||
|
let path = base_path.join(subdirectory);
|
||||||
|
if !path.exists() {
|
||||||
|
return Err(format!(
|
||||||
|
"Directory does not exist. Please run the `fetch` subcommand."
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Ok(());
|
||||||
|
}
|
Loading…
Reference in a new issue