pub mod utilities {
use dialoguer::Select;
use std::io::Write;
use std::{io, io::Read};
pub fn util_concat_strvec_flag(stringvec: &mut Vec<String>, flag: char) -> String {
let mut i = 1;
while i < stringvec.len() {
stringvec[i] = format!("{}{}{}", flag, stringvec[i], flag);
i += 2;
}
let newstring = stringvec.join("");
newstring
}
pub fn util_concat_strvec(stringvec: &Vec<String>) -> String {
let mut newstring: String = String::new();
for item in stringvec {
newstring = format!("{}{}", newstring, item);
if !newstring.ends_with(' ') {
newstring = format!("{}{}", newstring, ' ');
}
}
newstring
}
pub fn util_get_lastchar(newstr: &String) -> Option<char> {
let last_char = newstr.chars().nth(newstr.len() - 1);
last_char
}
pub fn util_flaggedtxt_2vec(txtstr: &String, flag: char) -> Vec<&str> {
let usestring = txtstr.trim();
let txtvec: Vec<&str> = usestring.split(flag).collect();
let mut between_flags_vec: Vec<&str> = Vec::new();
let mut i = 1;
while i < txtvec.len() {
between_flags_vec.push(txtvec[i]);
i += 2;
}
between_flags_vec
}
pub fn util_wait_for_enter() {
println!("Press 'Enter' to continue... \n");
io::stdout().flush().unwrap();
let mut buffer = [0u8; 1];
io::stdin().read_exact(&mut buffer).unwrap();
}
pub fn util_activity_menu(opts: &Vec<String>, prompt: &str) -> usize {
let choice: usize;
let index = Select::new()
.with_prompt(prompt)
.report(false)
.items(opts)
.default(0)
.interact();
match index {
Ok(index) => { choice = index + 1; },
Err(error) => panic!("Bad return from activity menu: {}.", error),
};
choice
}
}
pub mod input_utilities {
use std::io;
use std::io::Write;
use std::str::FromStr;
pub fn input_num_prompt_range(prompt: &str, min: i64, max: i64) -> i64 {
loop {
print!("{}", prompt);
let _ = io::stdout().flush().expect("Failed to flush stdout.");
let mut input = String::new();
io::stdin()
.read_line(&mut input)
.expect("Failed to read input.");
let input = match input.trim().parse() {
Ok(parsed_input) => parsed_input,
Err(_) => continue,
};
if (min..=max).contains(&input) {
return input;
} else {
println!("\n That choice isn't allowed! \n");
continue;
};
}
}
pub fn input_num_prompt<U: FromStr>(prompt: &str) -> U {
loop {
print!("{}", prompt);
let _ = io::stdout().flush().expect("Failed to flush stdout.");
let mut input = String::new();
io::stdin()
.read_line(&mut input)
.expect("Failed to read input.");
let input = match input.trim().parse::<U>() {
Ok(parsed_input) => parsed_input,
Err(_) => continue,
};
return input;
}
}
pub fn input_string_prompt(prompt: &str) -> String {
print!("{}", prompt);
let _ = io::stdout().flush().expect("Failed to flush stdout.");
let mut input = String::new();
std::io::stdin().read_line(&mut input).unwrap();
input.trim().to_string()
}
pub fn input_char_prompt(message: &str) -> char {
let word = input_string_prompt(message);
let mut letter = word.chars();
let character = letter.next().unwrap();
character
}
pub fn input_bool_prompt(message: &str) -> bool {
let mut value: String;
let truth_value: bool;
loop {
value = input_string_prompt(message).to_uppercase();
match value.as_str() {
"YES" => {
truth_value = true;
break;
}
"Y" => {
truth_value = true;
break;
}
"NO" => {
truth_value = false;
break;
}
"N" => {
truth_value = false;
break;
}
"TRUE" => {
truth_value = true;
break;
}
"T" => {
truth_value = true;
break;
}
"FALSE" => {
truth_value = false;
break;
}
"F" => {
truth_value = false;
break;
}
_ => {
println!(
"Please enter one of yes, Yes, y, Y, no, No, n, N, true, t,
false, f, True, T, False, or F"
);
}
};
}
truth_value
}
}
pub mod vec {
use rand::Rng;
pub fn vec_random_choice<T>(list: &Vec<T>) -> Option<(&T, usize)> {
if list.is_empty() {
return None;
}
let index = rand::thread_rng().gen_range(0..list.len());
Some((&list[index], index))
}
pub fn vec_string_to_str(list: &Vec<String>) -> Vec<&str> {
let mut uselist: Vec<&str> = Vec::new();
let mut i = 0;
while i < list.len() {
uselist.push(&list[i].as_str());
i += 1;
}
uselist
}
pub fn vec_longest_str(v: &Vec<String>) -> Option<&String> {
v.iter().max_by_key(|x| x.len())
}
pub fn vec_longest_str_len(stringvec: &Vec<String>) -> usize {
let mut longest = 0;
for item in stringvec {
if item.len() > longest {
longest = item.len();
}
}
longest
}
}