use synta::{GeneralizedTime, UtcTime};
use crate::Time;
pub fn parse_time(s: &str) -> Result<Time, String> {
let gt = GeneralizedTime::parse(s)?;
if (1950..=2049).contains(>.year) {
UtcTime::new(gt.year, gt.month, gt.day, gt.hour, gt.minute, gt.second)
.map(Time::UtcTime)
.map_err(|e| format!("invalid UTCTime '{s}': {e}"))
} else {
Ok(Time::GeneralTime(gt))
}
}
pub fn parse_generalized_time(s: &str) -> Result<GeneralizedTime, String> {
GeneralizedTime::parse(s)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parse_time_generalized_form() {
let t = parse_time("20240101120000Z").unwrap();
assert!(matches!(t, Time::UtcTime(_)), "2024 should be UTCTime");
}
#[test]
fn parse_time_generalized_future() {
let t = parse_time("20500101120000Z").unwrap();
assert!(
matches!(t, Time::GeneralTime(_)),
"2050 should be GeneralizedTime"
);
}
#[test]
fn parse_time_short_form() {
let t = parse_time("240101120000Z").unwrap();
assert!(matches!(t, Time::UtcTime(_)));
}
#[test]
fn parse_generalized_time_basic() {
let t = parse_generalized_time("20240601120000Z").unwrap();
let _ = t;
}
#[test]
fn parse_generalized_time_short_form() {
let t = parse_generalized_time("240601120000Z").unwrap();
let _ = t;
}
#[test]
fn invalid_time_returns_error() {
assert!(parse_time("not-a-time").is_err());
assert!(parse_generalized_time("not-a-time").is_err());
}
#[test]
fn invalid_time_error_contains_input() {
let err = parse_time("bad").unwrap_err();
assert!(
err.contains("bad"),
"error should echo the bad input: {err}"
);
}
}