use std::collections::HashMap; use std::fs::File; use std::io::{self, Read}; use std::path::Path; pub type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>; pub type Passport = HashMap<String, String>; pub fn read_file<P: AsRef<Path>>(path: P) -> io::Result<Vec<Passport>> { let mut file = File::open(path)?; let mut content = String::new(); file.read_to_string(&mut content)?; let mut passports = vec![]; for passport in content.split("\n\n") { let passport = passport.trim_end(); let pairs = passport.split(&['\n', ' ', ':'][..]).collect::<Vec<_>>(); let mut passport = Passport::new(); for pair in pairs.chunks_exact(2) { passport.insert(pair[0].to_owned(), pair[1].to_owned()); } passports.push(passport); } Ok(passports) }