1use std::io::stdin;
4
5pub fn input_multiple(comment: &str) -> Option<Vec<String>> {
7 println!("{}", comment);
8 let mut result: String = String::new();
9 match stdin().read_line(&mut result) {
10 Ok(_) => Some(result.split_whitespace().map(|s| s.to_string()).collect()),
11 Err(e) => {
12 println!("input_multiple read_line error: {}", e);
13 None
14 }
15 }
16}
17
18pub fn input_string(comment: &str) -> Option<String> {
20 println!("{}", comment);
21 let mut result: String = String::new();
22 match stdin().read_line(&mut result) {
23 Ok(_) => Some(result.trim().to_string()),
24 Err(e) => {
25 println!("input_string read_line error: {}", e);
26 None
27 }
28 }
29}
30
31pub fn input_s<T: std::str::FromStr>(comment: &str) -> Option<T> {
33 println!("{}", comment);
34 let mut result: String = String::new();
35 match stdin().read_line(&mut result) {
36 Ok(_) => {}
37 Err(e) => {
38 println!("input_s read_line error: {}", e);
39 return None;
40 }
41 }
42 match result.trim().parse() {
43 Ok(n) => Some(n),
44 Err(_) => {
45 println!("input_s parse error");
46 None
47 }
48 }
49}
50
51#[cfg(test)]
53mod tests {
54 use super::*;
55
56 #[test]
57 fn it_works() {
58 let test1: i64 = input_s::<i64>("i64: ").unwrap();
59 let test2: f32 = input_s::<f32>("f32: ").unwrap();
60 let test3: i8 = input_s::<i8>("i8: ").unwrap();
61 let test4: isize = input_s::<isize>("isize: ").unwrap();
62 let test5: String = input_string("string: ").unwrap();
63 let test6: Vec<String> = input_multiple("multiple: ").unwrap();
64 let temp: Vec<String> = vec!["abc".to_string(), "def".to_string()];
65 assert_eq!(1, test1);
66 assert_eq!(2.0, test2);
67 assert_eq!(3, test3);
68 assert_eq!(4, test4);
69 assert_eq!("abcde".to_string(), test5);
70 assert_eq!(temp, test6);
71 }
72}