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}