#[inline]
pub fn input<T>(msg: &str, default: Option<T>) -> T where T: core::fmt::Debug + std::str::FromStr {
return loop {
println!("{} [expected type = {:#?}, default = {:?}] ", msg, std::any::type_name::<T>(), default);
let mut raw_input = String::new();
std::io::stdin().read_line(&mut raw_input).expect("Failed to read line");
raw_input = raw_input.trim().to_string();
if raw_input == "" && default.is_some() {break default.unwrap();}; let parsed_input: Result<T, _> = raw_input.parse::<T>();
match parsed_input { Ok(num) => {break num;}, Err(_err) => {println!("could not parse the input `{:#?}`", raw_input); continue;},};
}}