1use std::io;
2use std::str::FromStr;
3use ErHandle::*;
4
5pub enum ErHandle<T> {
6 Pnc(T),
7 Msg(T),
8 Def,
9}
10
11pub fn input<T>(e: ErHandle<&str>) -> T
12where
13 T: FromStr,
14{
15 let mut input: String = String::new();
16 loop {
17 input.clear();
18 io::stdin().read_line(&mut input).unwrap();
19 if let Ok(input) = input.trim().parse::<T>() {
20 break input;
21 } else {
22 match e {
23 Pnc(e) => panic!("{}", e),
24 Msg(e) => println!("{}", e),
25 Def => println!("Input not supported"),
26 }
27 }
28 }
29}
30
31pub fn input_w_msg<T>(a: &str, e: ErHandle<&str>) -> T
32where
33 T: FromStr,
34{
35 let mut input: String = String::new();
36 loop {
37 println!("{}", a);
38 input.clear();
39 io::stdin().read_line(&mut input).unwrap();
40 if let Ok(input) = input.trim().parse::<T>() {
41 break input;
42 } else {
43 match e {
44 Pnc(e) => panic!("{}", e),
45 Msg(e) => println!("{}", e),
46 Def => println!("Input not supported"),
47 }
48 }
49 }
50}
51
52pub fn inputfn<T>(e: impl Fn()) -> T
53where
54 T: FromStr,
55{
56 let mut input: String = String::new();
57 loop {
58 input.clear();
59 io::stdin().read_line(&mut input).unwrap();
60 if let Ok(input) = input.trim().parse::<T>() {
61 break input;
62 } else {
63 e();
64 }
65 }
66}