inputparser/
lib.rs

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}