aoc-rs-2021/src/day_05/parsing.rs
2021-12-13 07:35:55 +01:00

49 lines
1.2 KiB
Rust

use super::model::{Line, Point};
use crate::parsing::{newline, parse_n, parse_number};
use yap::Tokens;
pub fn parse_point(tokens: &mut impl Tokens<Item = char>) -> Option<Point> {
parse_n(tokens, |t| parse_number(t), |t| t.token(',')).map(|point: [usize; 2]| Point {
x: point[0],
y: point[1],
})
}
pub fn parse_line(tokens: &mut impl Tokens<Item = char>) -> Option<Line> {
parse_n(tokens, |t| parse_point(t), |t| t.tokens(" -> ".chars())).map(|points: [Point; 2]| {
Line {
start: points[0],
end: points[1],
}
})
}
pub fn parse_lines(tokens: &mut impl Tokens<Item = char>) -> Vec<Line> {
tokens.sep_by(|t| parse_line(t), |t| newline(t)).collect()
}
#[cfg(test)]
mod test {
use super::super::model::{Line, Point};
use yap::IntoTokens;
#[test]
fn parse_point() {
assert_eq!(
Some(Point { x: 1, y: 3 }),
super::parse_point(&mut "1,3".into_tokens())
);
}
#[test]
fn parse_line() {
assert_eq!(
Some(Line {
start: Point { x: 1, y: 3 },
end: Point { x: 5, y: 3 }
}),
super::parse_line(&mut "1,3 -> 5,3".into_tokens())
);
}
}