use problemo::{common::*, *};
pub trait FileReader {
fn read_files(
&self,
paths: &[&str],
problems: ProblemReceiverRef,
) -> Result<Vec<String>, Problem>;
}
pub struct StandardFileReader;
impl FileReader for StandardFileReader {
fn read_files(
&self,
paths: &[&str],
mut problems: ProblemReceiverRef,
) -> Result<Vec<String>, Problem> {
let mut strings = Vec::default();
for path in paths {
if let Some(string) = std::fs::read_to_string(path)
.via(LowLevelError)
.give_ok(&mut problems)?
{
strings.push(string);
}
}
Ok(strings)
}
}
fn run(file_reader: Box<dyn FileReader>) -> Result<Vec<String>, Problem> {
let mut problems = Problems::default();
let strings = file_reader.read_files(
&["non-existing1.txt", "non-existing2.txt"],
problems.as_ref(),
)?;
problems.check()?;
Ok(strings)
}
fn main() {
if let Err(problem) = run(Box::new(StandardFileReader)) {
match problem.error_of_type::<Problems>() {
Some(problems) => {
for problem in problems {
println!("• {}", problem);
}
}
None => println!("{}", problem),
}
}
}