fetch subcommand complete

This commit is contained in:
Vomitblood 2024-04-02 19:08:09 +08:00
parent 019138f84d
commit 79e714d2d8
2 changed files with 121 additions and 88 deletions

View file

@ -15,6 +15,7 @@ pub fn fetch(extract_destination: &std::path::Path, verbose: bool) {
Ok(_) => (), Ok(_) => (),
Err(e) => { Err(e) => {
eprintln!("Error fetching colorscripts archive: {}", e); eprintln!("Error fetching colorscripts archive: {}", e);
cleanup().unwrap();
std::process::exit(1); std::process::exit(1);
} }
}; };
@ -23,19 +24,31 @@ pub fn fetch(extract_destination: &std::path::Path, verbose: bool) {
// now we have the raw images // now we have the raw images
match extract_colorscripts_archive() { match extract_colorscripts_archive() {
Ok(_) => (), Ok(_) => (),
Err(e) => eprintln!("Error extracting colorscripts archive: {}", e), Err(e) => {
eprintln!("Error extracting colorscripts archive: {}", e);
cleanup().unwrap();
std::process::exit(1);
}
}; };
// crop images to content // crop images to content
match crop_all_images_in_directory() { match crop_all_images_in_directory() {
Ok(_) => (), Ok(_) => (),
Err(e) => eprintln!("Error cropping images: {}", e), Err(e) => {
eprintln!("Error cropping images: {}", e);
cleanup().unwrap();
std::process::exit(1);
}
}; };
// convert images to unicode, both small and big // convert images to unicode, both small and big
match convert_images_to_ascii(extract_destination, verbose) { match convert_images_to_ascii(extract_destination, verbose) {
Ok(_) => (), Ok(_) => (),
Err(e) => eprintln!("Error converting images to ASCII: {}", e), Err(e) => {
eprintln!("Error converting images to ASCII: {}", e);
cleanup().unwrap();
std::process::exit(1);
}
}; };
// cleanup // cleanup

View file

@ -1,99 +1,119 @@
use clap::Parser;
/* /*
# Arguments # Arguments
## `fetch` - Fetch the latest colorscripts from the repository
- `extract_destination` - eXtract the colorscripts archive to a custom location
- `verbose` - Print colorscripts when generating
## Fetch ## `print` - Print a Pokemon colorscript
- `fetch` - Fetch the latest colorscripts from the repository - `name` - Select Pokemon by name
- `extract_destination` - eXtract the colorscripts archive to a specified location - `big` - Print a bigger version of the colorscript
- `verbose` - Print more information - `list` - Print a list of all Pokemon names
- `random` - Print a random Pokemon colorscript
## Print - `no-title` - Do not print Pokemon name
- `name` - Select pokemon by name - `shiny` - Print the shiny version of the colorscript
- `big` - Show a bigger version of the sprite
- `list` - Show a list of all pokemon names
- `no-title` - Do not display pokemon name
- `shiny` - Show the shiny version of the sprite
*/ */
/// Pokemon Colorscripts written in Rust /// Pokemon Colorscripts written in Rust
#[derive(Parser, Debug)]
#[command(version, about, long_about = None)]
struct Args {
// fetch
/// Fetch the latest colorscripts from the repository
#[arg(short, long, default_value_t = false)]
fetch: bool,
// extract destination
/// eXtract the colorscripts archive to a specified location
#[arg(short = 'x', long = "extract", default_value_t = String::from(""))]
extract_destination: String,
// verbose
/// Don't print colorscripts to the console when generating
#[arg(long = "verbose", default_value_t = false)]
verbose: bool,
/*
// big
/// Show a bigger version of the sprite
#[arg(short, long, default_value_t = false)]
big: bool,
// list
/// Show a list of all pokemon names
#[arg(short, long, default_value_t = false)]
list: bool,
// name
/// Select pokemon by name
#[arg(short = 'a', long, default_value_t = String::from(""))]
name: String,
// no-title
// NOTE: clap will convert the kebab-case to snake_case
// very smart!
// ...but very annoying for beginners
/// Do not display pokemon name
#[arg(long, default_value_t = false)]
no_title: bool,
// shiny
/// Show the shiny version of the sprite
#[arg(short, long, default_value_t = false)]
shiny: bool,
*/
}
fn main() { fn main() {
let args = argument_validation(); let args = argument_parser();
if args.fetch == true { if let Some(fetch_args) = args.subcommand_matches("fetch") {
// get data directory // fetch
let data_directory = match dirs::data_dir() { let extract_destination_raw: &String =
Some(dir) => dir.join("rustmon"), fetch_args.get_one::<String>("extract_destination").unwrap();
None => { let extract_destination: &std::path::Path = std::path::Path::new(extract_destination_raw);
println!("Data directory not found"); let verbose: bool = fetch_args.get_flag("verbose");
std::process::exit(1);
// display selections
println!("Extract destination: {}", extract_destination.display());
println!("Verbose: {}", verbose);
// invoke bigchungus fetch function
rustmon::fetch::fetch(extract_destination, verbose)
} else if let Some(print_args) = args.subcommand_matches("print") {
// print
if let Some(name) = print_args.get_one::<String>("name") {
// print/name
println!("name: {}", name);
} }
}; if print_args.get_flag("big") {
// print/big
// decicde whether to use the default data directory or the one specified by the user println!("big");
// if the user specifies a directory, use that }
let extract_destination = if args.extract_destination.is_empty() { println!("something else");
data_directory
} else {
std::path::PathBuf::from(&args.extract_destination)
};
rustmon::fetch::fetch(&extract_destination, args.verbose);
} else {
println!("print deez nuts");
} }
} }
fn argument_validation() -> Args { fn argument_parser() -> clap::ArgMatches {
let args = Args::parse(); return clap::command!()
// info
return args; .about("Pokemon Colorscripts written in Rust")
.author("Vomitblood")
// fetch subcommand
.subcommand(
clap::Command::new("fetch")
.about("Fetch the latest colorscripts from the repository")
// fetch/extract_destination
.arg(
clap::Arg::new("extract_destination")
.help("eXtract the colorscripts archive to a custom location")
.short('x')
.long("extract-destination")
.default_value(&*rustmon::constants::DATA_DIRECTORY.to_str().unwrap()),
)
// fetch/verbose
.arg(
clap::Arg::new("verbose")
.help("Select Pokemon by name")
.short('v')
.long("verbose")
.action(clap::ArgAction::SetTrue),
),
)
// print subcommand
.subcommand(
clap::Command::new("print")
.about("Print a Pokemon colorscript")
// print/big
.arg(
clap::arg!(-b --big "Print a bigger version of the colorscript")
.conflicts_with("list"),
)
// print/list
.arg(
clap::arg!(-l --list "Print a list of all Pokemon names")
.conflicts_with("name")
.conflicts_with("random"),
)
// print/name
.arg(
clap::Arg::new("name")
.help("Select Pokemon by name")
.short('n')
.long("name")
.conflicts_with("list")
.conflicts_with("random"),
)
// print/random
.arg(
clap::arg!(-r --random "Print a random Pokemon colorscript")
.conflicts_with("list")
.conflicts_with("name"),
)
// print/no-title
.arg(
clap::Arg::new("no-title")
.help("Do not print Pokemon name")
.long("no-title")
.action(clap::ArgAction::SetTrue)
.conflicts_with("list"),
)
// print/shiny
.arg(
clap::arg!(-s --shiny "Print the shiny version of the colorscript")
.conflicts_with("list"),
),
)
// finalize
.get_matches();
} }