use crate::error::{Error, Result};
use chrono::{Duration, Local};
pub fn is_valid_date_format(date: &str) -> bool {
date.len() == 8 && date.chars().all(|c| c.is_numeric())
}
pub fn validate_base_date(base_date: Option<String>) -> Result<String> {
let date = base_date.ok_or_else(|| {
Error::InvalidInput("date is required, call `date()` or `latest()`".to_string())
})?;
if !is_valid_date_format(&date) {
return Err(Error::InvalidInput(
"date must be in YYYYMMDD format".to_string(),
));
}
Ok(date)
}
pub fn latest_workday_string() -> String {
let yesterday = Local::now() - Duration::days(1);
yesterday.format("%Y%m%d").to_string()
}
#[macro_export]
macro_rules! impl_date_builder_methods {
($builder_type:ty) => {
impl<'a> $builder_type {
pub fn date(mut self, date: impl Into<String>) -> Self {
self.base_date = Some(date.into());
self
}
pub fn latest(mut self) -> Self {
self.base_date = Some($crate::api::common::latest_workday_string());
self
}
}
};
}