diff options
Diffstat (limited to 'src/2020')
-rw-r--r-- | src/2020/4/mod.rs | 31 |
1 files changed, 15 insertions, 16 deletions
diff --git a/src/2020/4/mod.rs b/src/2020/4/mod.rs index 98a35fb..b198c31 100644 --- a/src/2020/4/mod.rs +++ b/src/2020/4/mod.rs @@ -6,23 +6,22 @@ const REQUIRED_KEYS: &[&str] = pub fn parse(fh: File) -> Result<Vec<HashMap<String, String>>> { let mut res = vec![]; let mut cur = HashMap::new(); - for line in parse::lines(fh) { - if line.is_empty() { - res.push(cur); - cur = HashMap::new(); - continue; - } - - for field in line.split(' ') { - let mut parts = field.split(':'); - let key = parts.next().with_context(|| { - format!("failed to parse field '{}'", field) - })?; - let value = parts.next().with_context(|| { - format!("failed to parse field '{}'", field) - })?; - cur.insert(key.to_string(), value.to_string()); + let mut lines = parse::lines(fh).peekable(); + while lines.peek().is_some() { + for line in parse::chunk(&mut lines) { + for field in line.split(' ') { + let mut parts = field.split(':'); + let key = parts.next().with_context(|| { + format!("failed to parse field '{}'", field) + })?; + let value = parts.next().with_context(|| { + format!("failed to parse field '{}'", field) + })?; + cur.insert(key.to_string(), value.to_string()); + } } + res.push(cur); + cur = HashMap::new(); } if !cur.is_empty() { res.push(cur); |