use std::unreachable;
use crate::cookbook::ch_2_simple_example::Time;
use crate::prelude::*;
pub fn parse_time(s: &str) -> Result<(&str, Time), ParsingError> {
Cursor::from(s)
.chars_any(5..=5)
.parse_selection::<Time>()
.validate()
}
pub fn parse_clock(s: &str) -> Result<(&str, Time), ParsingError> {
let (c1, time) = Cursor::from(s)
.chars_any(5..=5)
.parse_selection::<Time>()
.ws()
.validate()?;
if let Ok((c2, ampm)) = Cursor::from(c1)
.clone()
.text_alt(&["AM", "PM"])
.parse_selection_as_str() .ws()
.validate()
{
let time = match ampm.to_lowercase().as_str() {
"am" => time,
"pm" => Time::new(time.hours + 12, time.mins),
_ => unreachable!(),
};
return Ok((c2, time)); }
Ok((c1, time))
}
pub fn parse_clock_v2(c: &str) -> Result<(&str, Time), ParsingError> {
let (c1, time, ampm) = Cursor::from(c)
.debug_context("clockv2")
.chars_any(5..=5)
.parse_selection::<Time>()
.ws()
.text_alt(&["AM", "PM", ""]) .parse_selection_as_str()
.ws()
.validate()?;
{
let time = match ampm {
"AM" | "" => time,
"PM" => Time::new(time.hours + 12, time.mins),
_ => unreachable!(),
};
Ok((c1, time)) }
}
#[cfg(test)]
mod tests {
use super::*;
use test_log::test;
#[test]
fn test_parse_clock() -> Result<(), ParsingError> {
assert_eq!(parse_clock("11:35 AM")?.1, Time::new(11, 35));
assert_eq!(parse_clock("11:59 PM")?.1, Time::new(23, 59));
assert_eq!(parse_clock("01:59")?.1, Time::new(1, 59));
assert_eq!(parse_clock("1:59").is_err(), true);
assert_eq!(parse_clock("11:35 AM X")?.0, "X");
assert_eq!(parse_clock("11:59 PM Y")?.0, "Y");
assert_eq!(parse_clock("01:59 Z")?.0, "Z");
Ok(())
}
#[test]
fn test_parse_clock_v2() -> Result<(), ParsingError> {
assert_eq!(parse_clock_v2("11:35 AM")?.1, Time::new(11, 35));
assert_eq!(parse_clock_v2("11:59 PM")?.1, Time::new(23, 59));
assert_eq!(parse_clock_v2("01:59")?.1, Time::new(1, 59));
assert_eq!(parse_clock_v2("1:59").is_err(), true);
assert_eq!(parse_clock_v2("11:35 AM X")?.0, "X");
assert_eq!(parse_clock_v2("11:59 PM Y")?.0, "Y");
assert_eq!(parse_clock_v2("01:59 Z")?.0, "Z");
Ok(())
}
}