use std::{ fs::File, io::{BufReader, Read, StdinLock}, path::PathBuf, }; use crate::Result; #[derive(Debug)] pub enum Input { Stdin, File(PathBuf), } impl From<&str> for Input { fn from(value: &str) -> Self { Self::File(PathBuf::from(value)) } } impl Input { pub(crate) fn reader(self) -> Result> { Ok(match self { Input::File(p) => InputReader::File(BufReader::new(File::open(p)?)), Input::Stdin => InputReader::Stdin(std::io::stdin().lock()), }) } } #[derive(Debug)] pub enum InputReader<'a> { Stdin(StdinLock<'a>), File(BufReader), } impl Read for InputReader<'_> { fn read(&mut self, buf: &mut [u8]) -> std::io::Result { match self { InputReader::Stdin(s) => s.read(buf), InputReader::File(p) => p.read(buf), } } }