1use std::io;
3use std::io::BufRead;
4
5pub trait USIInputReader {
7 fn read(&mut self) -> io::Result<Option<String>>;
8}
9pub struct USIStdInputReader {
11
12}
13impl USIStdInputReader {
14 pub fn new() -> USIStdInputReader {
16 USIStdInputReader {
17
18 }
19 }
20}
21impl USIInputReader for USIStdInputReader {
22 fn read(&mut self) -> io::Result<Option<String>> {
24 let stdin = io::stdin();
25 let mut lock = stdin.lock();
26 let mut buf = String::new();
27
28 if lock.read_line(&mut buf)? == 0 {
29 Ok(None)
30 } else {
31 let ptn:&[_] = &['\r','\n'];
32
33 Ok(Some(buf.as_str().trim_end_matches(ptn).to_string()))
34 }
35 }
36}