Skip to main content

struct_input/
util.rs

1pub mod formats;
2
3use tokio::io::{self, AsyncBufReadExt, BufReader};
4use crate::Format;
5
6pub async fn read_string_option(name: &str, format_checker: Format) -> Option<String> {
7    let mut reader = BufReader::new(io::stdin());
8    loop {
9        println!("--- type {name} ---");
10        println!("(Leave empty and press Enter to set as None)");
11        let mut value = String::new();
12        match reader.read_line(&mut value).await {
13            Ok(_) => (),
14            Err(_) => continue
15        }
16
17        let value = value.trim();
18
19        if value.is_empty() {
20            return None
21        }
22
23        if format_checker.valid(value) {
24            return Some(value.to_string());
25        } else {
26            println!("invalid input");
27        }
28    }
29}
30
31pub async fn read_string(name: &str, format_checker: Format) -> String {
32    let mut reader = BufReader::new(io::stdin());
33    loop {
34        println!("--- type {name} ---");
35        let mut value = String::new();
36        match reader.read_line(&mut value).await {
37            Ok(_) => (),
38            Err(_) => continue
39        }
40
41        let value = value.trim();
42
43        if format_checker.valid(value) {
44            return value.to_string();
45        } else {
46            println!("invalid input");
47        }
48    }
49}
50
51pub async fn read_int(name: &str) -> i32 {
52    let mut reader = BufReader::new(io::stdin());
53    loop {
54        println!("--- type {name} ---");
55        let mut value = String::new();
56        match reader.read_line(&mut value).await {
57            Ok(_) => (),
58            Err(_) => continue
59        }
60
61        let value = value.trim();
62
63        match value.parse() {
64            Ok(value) => {
65                return value
66            },
67            Err(_) => {
68                println!("invalid input");
69                continue;
70            }
71        };
72    }
73}