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}