Remove bad input abstraction in favor of boxed trait
Getty Ritter
7 years ago
| 4 | 4 | pub const AUTHOR: &'static str = |
| 5 | 5 | "Getty Ritter <rrecutils@infinitenegativeutility.com>"; |
| 6 | 6 | |
| 7 | pub enum Input { | |
| 8 | Stdin(io::BufReader<io::Stdin>), | |
| 9 | File(io::BufReader<fs::File>), | |
| 10 | } | |
| 11 | ||
| 12 | impl io::Read for Input { | |
| 13 | fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { | |
| 14 | match self { | |
| 15 | &mut Input::Stdin(ref mut stdin) => | |
| 16 | stdin.read(buf), | |
| 17 | &mut Input::File(ref mut file) => | |
| 18 | file.read(buf), | |
| 7 | /// If this doesn't name a path, or if the path is `"-"`, then return | |
| 8 | /// a buffered reader from stdin; otherwise, attempt to open the file | |
| 9 | /// named by the path and return a buffered reader around it | |
| 10 | pub fn input_from_spec<'a>( | |
| 11 | spec: Option<&'a str> | |
| 12 | ) -> io::Result<io::BufReader<Box<io::Read>>> { | |
| 13 | match spec.unwrap_or("-") { | |
| 14 | "-" => Ok(io::BufReader::new(Box::new(io::stdin()))), | |
| 15 | path => { | |
| 16 | let f = fs::File::open(path)?; | |
| 17 | Ok(io::BufReader::new(Box::new(f))) | |
| 19 | 18 | } |
| 20 | 19 | } |
| 21 | 20 | } |
| 22 | 21 | |
| 23 | impl io::BufRead for Input { | |
| 24 | fn fill_buf(&mut self) -> io::Result<&[u8]> { | |
| 25 | match self { | |
| 26 | &mut Input::Stdin(ref mut stdin) => | |
| 27 | stdin.fill_buf(), | |
| 28 | &mut Input::File(ref mut file) => | |
| 29 | file.fill_buf(), | |
| 30 | } | |
| 31 | } | |
| 32 | ||
| 33 | fn consume(&mut self, amt: usize) { | |
| 34 | match self { | |
| 35 | &mut Input::Stdin(ref mut stdin) => | |
| 36 | stdin.consume(amt), | |
| 37 | &mut Input::File(ref mut file) => | |
| 38 | file.consume(amt), | |
| 39 | } | |
| 40 | } | |
| 41 | } | |
| 42 | ||
| 43 | pub fn input_from_spec<'a>( | |
| 44 | spec: Option<&'a str> | |
| 45 | ) -> io::Result<Input> { | |
| 46 | match spec.unwrap_or("-") { | |
| 47 | "-" => Ok(Input::Stdin(io::BufReader::new(io::stdin()))), | |
| 48 | path => { | |
| 49 | let f = fs::File::open(path)?; | |
| 50 | Ok(Input::File(io::BufReader::new(f))) | |
| 51 | } | |
| 52 | } | |
| 53 | } | |
| 54 | ||
| 22 | /// If this doesn't name a path, or if the path is `"-"`, then return | |
| 23 | /// a buffered writer to stdout; otherwise, attempt to open the file | |
| 24 | /// named by the path and return a writer around it | |
| 55 | 25 | pub fn output_from_spec<'a>( |
| 56 | 26 | spec: Option<&'a str> |
| 57 | 27 | ) -> io::Result<Box<io::Write>> |