#[must_use]
pub fn parse_notes_list(input: &str) -> Vec<(String, String)> {
input
.lines()
.filter_map(|line| {
let mut parts = line.split_whitespace();
let note = parts.next()?;
let object = parts.next()?;
Some((note.to_string(), object.to_string()))
})
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parses_pairs() {
let input = "note1 obj1\nnote2 obj2\n";
let pairs = parse_notes_list(input);
assert_eq!(pairs.len(), 2);
assert_eq!(pairs[0], ("note1".to_string(), "obj1".to_string()));
assert_eq!(pairs[1], ("note2".to_string(), "obj2".to_string()));
}
#[test]
fn skips_blank_and_malformed_lines() {
let input = "\nnote1 obj1\nlonely\n";
let pairs = parse_notes_list(input);
assert_eq!(pairs.len(), 1);
assert_eq!(pairs[0].0, "note1");
}
#[test]
fn empty_input() {
assert!(parse_notes_list("").is_empty());
}
}