completed say function
This commit is contained in:
parent
976cc75483
commit
d7d7205d38
|
@ -3,7 +3,7 @@
|
|||
pkgname=rustmon-git
|
||||
pkgdesc="Pokemon Colorscripts written in Rust"
|
||||
_gitname=rustmon
|
||||
pkgver=r47.31f64ae
|
||||
pkgver=r49.976cc75
|
||||
pkgrel=1
|
||||
arch=('x86_64')
|
||||
url="https://github.com/Vomitblood/$_gitname"
|
||||
|
|
|
@ -2,5 +2,6 @@ pub mod constants;
|
|||
pub mod fetch;
|
||||
pub mod list;
|
||||
pub mod print;
|
||||
pub mod say;
|
||||
pub mod structs;
|
||||
pub mod validation;
|
||||
|
|
37
src/main.rs
37
src/main.rs
|
@ -15,6 +15,9 @@
|
|||
- `pokedex` - Print Pokemon by list of space-separated Pokedex numbers. Use `0` to print a random Pokemon.
|
||||
- `shiny` - Rate of printing the shiny version of the colorscript
|
||||
- `spacing` - Number of spaces between colorscripts
|
||||
|
||||
## `say` - Print a speaking Pokemon
|
||||
- `text` - Input text for Pokemon to say
|
||||
*/
|
||||
|
||||
/// Pokemon Colorscripts written in Rust
|
||||
|
@ -33,7 +36,7 @@ fn main() {
|
|||
println!("Verbose: {verbose}");
|
||||
|
||||
// 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") {
|
||||
// list
|
||||
|
||||
|
@ -49,7 +52,7 @@ fn main() {
|
|||
eprintln!("Error: {e}");
|
||||
std::process::exit(1);
|
||||
}
|
||||
}
|
||||
};
|
||||
} else {
|
||||
// list/forms
|
||||
match rustmon::list::print_pokemon_forms(pokemon_name) {
|
||||
|
@ -58,7 +61,7 @@ fn main() {
|
|||
eprintln!("Error: {e}");
|
||||
std::process::exit(1);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
} else if let Some(print_args) = args.subcommand_matches("print") {
|
||||
// print
|
||||
|
@ -77,6 +80,15 @@ fn main() {
|
|||
|
||||
// print
|
||||
rustmon::print::print(big, forms, hide_name, names, pokedexes, shiny_rate, spacing);
|
||||
} else if let Some(say_args) = args.subcommand_matches("say") {
|
||||
// say
|
||||
|
||||
// validate files first
|
||||
rustmon::validation::validate_files();
|
||||
|
||||
let text: &String = say_args.get_one::<String>("text").unwrap();
|
||||
|
||||
rustmon::say::say(text);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -207,6 +219,25 @@ For more advanced usage, use `less` or `more` to scroll through the list!",
|
|||
.required(false),
|
||||
)
|
||||
)
|
||||
// say subcommand
|
||||
.subcommand(
|
||||
clap::Command::new("say")
|
||||
.about("Print a speaking Pokemon")
|
||||
.after_help(
|
||||
"Tip: Pipe the output to `rustmon say` to see the Pokemon speak!
|
||||
Example: `echo \"Never gonna give you up\" | rustmon say`"
|
||||
)
|
||||
// say/text
|
||||
.arg(
|
||||
clap::Arg::new("text")
|
||||
.help("Input text for Pokemon to say")
|
||||
.short('t')
|
||||
.long("text")
|
||||
.default_value("")
|
||||
.hide_default_value(true)
|
||||
.required(false)
|
||||
)
|
||||
)
|
||||
.subcommand_required(true)
|
||||
// finalize
|
||||
.get_matches();
|
||||
|
|
82
src/say.rs
Normal file
82
src/say.rs
Normal file
|
@ -0,0 +1,82 @@
|
|||
pub fn say(text: &str) {
|
||||
// first prioritise input text
|
||||
if !text.is_empty() {
|
||||
// if input text was provided
|
||||
let content = split_into_lines(text);
|
||||
print_speech_bubble(&content);
|
||||
crate::print::print(
|
||||
false,
|
||||
vec![&"regular".to_string()],
|
||||
true,
|
||||
vec![&"random".to_string()],
|
||||
vec![0],
|
||||
0.0,
|
||||
0,
|
||||
)
|
||||
} else {
|
||||
// if no input text was provided
|
||||
let buffer = read_from_stdin();
|
||||
let content = split_into_lines(buffer.as_str());
|
||||
print_speech_bubble(&content);
|
||||
crate::print::print(
|
||||
false,
|
||||
vec![&"regular".to_string()],
|
||||
true,
|
||||
vec![&"random".to_string()],
|
||||
vec![0],
|
||||
0.0,
|
||||
0,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fn read_from_stdin() -> String {
|
||||
use std::io::Read;
|
||||
let mut buffer = String::new();
|
||||
std::io::stdin()
|
||||
.read_to_string(&mut buffer)
|
||||
.expect("Failed to read from stdin");
|
||||
|
||||
// trim newline character from end of buffer
|
||||
buffer.trim_end().to_string()
|
||||
}
|
||||
|
||||
fn split_into_lines(input: &str) -> Vec<String> {
|
||||
input
|
||||
// splits the input string on newlines
|
||||
.lines()
|
||||
// converts each line to a string
|
||||
.map(|line| line.to_string())
|
||||
// collects all lines into a Vec<String>
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn print_speech_bubble(content: &[String]) {
|
||||
// determine the maximum length of the content lines, with a minimum of 24
|
||||
let mut max_length = content.iter().map(|line| line.len()).max().unwrap_or(0);
|
||||
max_length = max_length.max(24); // Ensure minimum width of 20
|
||||
|
||||
// print the top border
|
||||
println!("+{}+", "-".repeat(max_length + 2));
|
||||
|
||||
// print each line centered within the bubble
|
||||
for line in content.iter() {
|
||||
let padding = max_length - line.len();
|
||||
// padding to the left
|
||||
let left_padding = padding / 2;
|
||||
// padding to the right to balance out any odd number of padding spaces
|
||||
let right_padding = padding - left_padding;
|
||||
|
||||
println!(
|
||||
"| {}{}{} |",
|
||||
" ".repeat(left_padding),
|
||||
line,
|
||||
" ".repeat(right_padding)
|
||||
);
|
||||
}
|
||||
|
||||
// print the bottom border
|
||||
println!("+{}+", "-".repeat(max_length + 2));
|
||||
println!(" //");
|
||||
println!(" //");
|
||||
}
|
Loading…
Reference in a new issue