#[allow(clippy::wildcard_imports)]
use super::*;
pub fn today() -> String {
let secs = SystemTime::now()
.duration_since(UNIX_EPOCH)
.map(|d| d.as_secs())
.unwrap_or(0);
let days = (secs / 86_400) as i64;
let (y, m, d) = civil_from_days(days);
format!("{y:04}-{m:02}-{d:02}")
}
pub fn utc_now_rfc3339() -> String {
let secs = SystemTime::now()
.duration_since(UNIX_EPOCH)
.map(|d| d.as_secs())
.unwrap_or(0);
let days = (secs / 86_400) as i64;
let rem = secs % 86_400;
let (y, m, d) = civil_from_days(days);
format!(
"{y:04}-{m:02}-{d:02}T{:02}:{:02}:{:02}Z",
rem / 3600,
(rem % 3600) / 60,
rem % 60
)
}
pub fn validate_date(s: &str) -> bool {
let b = s.as_bytes();
if b.len() != 10 || b[4] != b'-' || b[7] != b'-' {
return false;
}
for &c in &b[0..4] {
if !c.is_ascii_digit() {
return false;
}
}
for &c in &[b[5], b[6], b[8], b[9]] {
if !c.is_ascii_digit() {
return false;
}
}
let year = u32::from(b[0] - b'0') * 1000
+ u32::from(b[1] - b'0') * 100
+ u32::from(b[2] - b'0') * 10
+ u32::from(b[3] - b'0');
let month = u32::from(b[5] - b'0') * 10 + u32::from(b[6] - b'0');
let day = u32::from(b[8] - b'0') * 10 + u32::from(b[9] - b'0');
if year < 1970 || !(1..=12).contains(&month) {
return false;
}
day >= 1 && day <= days_in_month(year, month)
}
pub fn validate_issue_dates(start_date: Option<&str>, due_date: Option<&str>) -> Result<()> {
if let Some(start) = start_date
&& validate_date_msg(start).is_err()
{
return Err(TixError::Config(format!(
"start_date {start:?} must be a `YYYY-MM-DD` calendar date"
)));
}
if let Some(due) = due_date {
if validate_date_msg(due).is_err() {
return Err(TixError::Config(format!(
"due_date {due:?} must be a `YYYY-MM-DD` calendar date"
)));
}
if let Some(start) = start_date
&& !date_lte(start, due)
{
return Err(TixError::Config(format!(
"due_date {due:?} must be `>= start_date` {start:?}"
)));
}
}
Ok(())
}
pub fn date_lte(a: &str, b: &str) -> bool {
a <= b
}