use std::io::{BufRead, Error}; use std::path::PathBuf; #[derive(Debug)] pub(crate) struct Entry { filename: PathBuf } #[derive(Debug)] pub(crate) struct Config { entries: Vec } impl Entry {} impl Config {} pub(crate) fn create_config(reader: impl BufRead) -> Result { let lines= reader.lines(); let(successful_lines, failed_lines) : (Vec>, Vec>) = lines.partition(Result::is_ok); let successful_lines : Vec<_> = successful_lines.into_iter().map(Result::unwrap).collect(); let failed_lines : Vec<_> = failed_lines.into_iter().map(Result::unwrap_err).collect(); if !failed_lines.is_empty() { return Result::Err(format!("Something went wrong when parsing file lines")); } let (entries, failures) : (Vec>, Vec>) = successful_lines.into_iter().map(|line| { match line.split_whitespace().collect::>().as_slice() { [s] => { return Result::Ok(Entry {filename: PathBuf::from(s)}); } _ => { return Result::Err(format!("Line contains invalid Entry: {}", line)); } } }).partition(Result::is_ok); let entries : Vec<_> = entries.into_iter().map(Result::unwrap).collect(); let failures : Vec<_> = failures.into_iter().map(Result::unwrap_err).collect(); if !failures.is_empty() { return Result::Err(failures.first().unwrap().to_string()) } return Result::Ok(Config {entries}); }