get_user_input/
lib.rs

1use std::io::{stdin, stdout, Write};
2use std::str::FromStr;
3
4#[doc(hidden)]
5pub fn get__<F: FromStr>() -> Result<F, <F as FromStr>::Err> {
6  let mut s = String::new();
7  let _ = stdout().flush();
8
9  stdin()
10    .read_line(&mut s)
11    .expect("user did not enter correct string");
12
13  if let Some('\n') = s.chars().next_back() {
14    s.pop();
15  }
16
17  if let Some('\r') = s.chars().next_back() {
18    s.pop();
19  }
20
21  s.parse::<F>()
22}
23
24#[doc(hidden)]
25pub fn set__<F: FromStr>(value: &mut F) {
26  if let Ok(i) = get__::<F>() {
27    *value = i;
28  }
29}
30
31#[macro_export]
32macro_rules! get_input {
33  ($generic: ty) => {
34    $crate::get__::<$generic>()
35  };
36
37  ($generic: ty, $($arg:tt)*) => {{
38    print!("{}",format_args!($($arg)*));
39    $crate::get__::<$generic>()
40  }};
41}
42
43#[macro_export]
44macro_rules! set_from_input {
45  ($value: expr) => {
46    $crate::set__($value)
47  };
48
49  ($value: expr, $($arg:tt)*) => {{
50    print!("{}",format_args!($($arg)*));
51    $crate::set__($value)
52  }};
53}