diff --git a/src/main.rs b/src/main.rs index 5a534ea..1b2238f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,19 +17,31 @@ struct Dictionary { } impl Dictionary { - fn load_from_iterable(&mut self, lines: impl Iterator>) { - let mut it = lines; + fn words_from_iterable( + lines: impl Iterator>, + ) -> Result, Error> { // aux_set is used only to deduplicate // so we're still using a normal Vec, and perform deduplication at load time let mut aux_set = HashSet::new(); - for line in it.by_ref() { - let line = line.unwrap(); - let word = line_to_word(line); - if !aux_set.contains(&word) { - //println!("Inserisco: {}", word); - aux_set.insert(word.clone()); - self.words.push(word); - } + lines + .filter(|res| match res { + Ok(word) => aux_set.insert(word.clone()), + _ => false, + }) + .collect() + } + + fn load(fname: String) -> Result { + let maybe_words = File::open(fname) + .and_then(|open_f| Ok(BufReader::new(open_f))) + .and_then(|buf| Self::words_from_iterable(buf.lines())); + + match maybe_words { + Ok(words) => Ok(Dictionary { + words, + iter_position: 0, + }), + Err(err) => Err(err), } } } @@ -84,14 +96,13 @@ fn main() { let fname = &args[1]; let pattern = &args[2]; - let f = File::open(fname).unwrap(); - let buf = BufReader::new(&f); - let mut d = Dictionary::default(); - d.load_from_iterable(buf.lines()); + let d = Dictionary::load(fname.to_string()); //let filter = matches_regexp(pattern); let filter = is_anagram(pattern); - for w in d.words.iter().filter(filter) { - println!("{}", w) - } + if let Ok(dict) = d { + for w in dict.words.iter().filter(filter) { + println!("{}", w); + } + }; }