You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
uwuifyy/src/main.rs

131 lines
4.2 KiB
Rust

use clap::{Arg, ArgGroup, ErrorKind};
use uwuifyy::UwUify;
macro_rules! app {
() => {
clap::App::new(env!("CARGO_PKG_NAME"))
.author(env!("CARGO_PKG_AUTHORS"))
.version(env!("CARGO_PKG_VERSION"))
.about(env!("CARGO_PKG_DESCRIPTION"))
.long_about(None)
.group(
ArgGroup::new("uwu")
.required(true)
.args(&["text", "infile"]),
)
.arg(
Arg::new("text")
.help("Text to uwu'ify")
.short('t')
.long("text")
3 years ago
.value_name("TEXT")
.required_unless_present_all(["infile", "outfile"])
.display_order(1),
)
.arg(
Arg::new("infile")
.help("The file to uwu'ify")
.short('i')
.long("infile")
.conflicts_with("text")
.requires("outfile")
.value_name("FILE")
.value_hint(clap::ValueHint::FilePath)
.display_order(2),
)
.arg(
Arg::new("outfile")
.help("The file to output uwu'ified text")
.short('o')
.long("outfile")
.value_name("FILE")
.value_hint(clap::ValueHint::FilePath)
.display_order(3),
)
.arg(
Arg::new("words")
.help("The modifier to determine how many words to be uwu'ified")
.short('w')
.long("words")
.value_name("VALUE")
.default_value("1")
.validator(is_between_zero_and_one)
.display_order(4),
)
.arg(
Arg::new("faces")
.help("The modifier for uwu faces e.g hello -> hewwo")
.short('f')
.long("faces")
.value_name("VALUE")
.default_value("0.05")
.validator(is_between_zero_and_one)
.display_order(5),
)
.arg(
Arg::new("actions")
.help("The modifier for actions e.g *shuffles over*")
.short('a')
.long("actions")
.value_name("VALUE")
.default_value("0.125")
.validator(is_between_zero_and_one)
.display_order(6),
)
.arg(
Arg::new("stutters")
.help("The modifier for stutters e.g b-baka!")
.short('s')
.long("stutters")
.value_name("VALUE")
.default_value("0.225")
.validator(is_between_zero_and_one)
.display_order(7),
)
.arg(
Arg::new("random")
.help("Flag to enable/disable random uwu'ifying")
.short('r')
.long("random")
.display_order(8),
)
};
}
fn main() {
std::panic::set_hook(Box::new(|info| {
app!().error(ErrorKind::DisplayHelp, info).exit();
}));
let matches = app!().get_matches();
// panicing here ensures that the error is passed to the hook above instead of to stdout.
match UwUify::new(
matches.value_of("text"),
matches.value_of("infile"),
matches.value_of("outfile"),
matches.value_of("words"),
matches.value_of("faces"),
matches.value_of("actions"),
matches.value_of("stutters"),
matches.is_present("random"),
)
.uwuify()
{
Err(e) => panic!("{}", e),
_ => {}
};
}
3 years ago
fn is_between_zero_and_one(input: &str) -> Result<(), &'static str> {
let value = match input.parse::<f32>() {
Ok(value) => value,
3 years ago
Err(_) => return Err("The value must be a decimal number"),
};
if (0.0..=1.0).contains(&value) {
return Ok(());
}
3 years ago
Err("The value must be between 0.0 and 1.0")
}