pub mod approx;
pub(crate) mod compat;
pub mod parse;
pub mod show;
pub mod tm;
use thiserror::Error;
#[derive(Clone, Debug, Eq, PartialEq, Error)]
pub enum DateSpecError {
#[error("unparseable date spec: {spec:?}")]
Unparseable {
spec: String,
},
}
pub fn parse_date_cutoff(spec: &str, now_sec: i64) -> Result<i64, DateSpecError> {
let trimmed = spec.trim();
let mut err = 0;
let ts = approx::approxidate_careful_at(trimmed, now_sec, Some(&mut err));
if err != 0 {
return Err(DateSpecError::Unparseable {
spec: spec.to_string(),
});
}
i64::try_from(ts).map_err(|_| DateSpecError::Unparseable {
spec: spec.to_string(),
})
}
#[cfg(test)]
mod tests {
use super::parse_date_cutoff;
use super::DateSpecError;
const NOW: i64 = 1_700_100_000;
#[test]
fn cutoff_rejects_garbage() {
assert_eq!(
parse_date_cutoff("", NOW),
Err(DateSpecError::Unparseable {
spec: String::new()
})
);
assert!(matches!(
parse_date_cutoff("!!!not-a-date!!!", NOW),
Err(DateSpecError::Unparseable { .. })
));
}
}