use std::collections::HashSet;
use std::sync::{LazyLock, Mutex};
pub fn today() -> chrono::NaiveDate {
chrono::Utc::now().date_naive()
}
pub fn date(s: &str) -> chrono::NaiveDate {
chrono::NaiveDate::parse_from_str(s, "%Y-%m-%d")
.unwrap_or_else(|_| panic!("invalid date {s:?} in deprecated_at!, expected YYYY-MM-DD"))
}
pub static WARNED: LazyLock<Mutex<HashSet<String>>> = LazyLock::new(Default::default);
#[macro_export]
macro_rules! deprecated_at {
($warn_at:expr, $remove_at:expr, $id:expr, $($arg:tt)*) => {{
let warn_date = $crate::deprecated::date($warn_at);
let remove_date = $crate::deprecated::date($remove_at);
let today = $crate::deprecated::today();
debug_assert!(
today < remove_date,
"Deprecated code [{}] should have been removed on {}. Please remove this deprecated functionality.",
$id, $remove_at
);
if today >= warn_date
&& $crate::deprecated::WARNED.lock().unwrap().insert(($id).to_string())
{
::log::warn!(
"deprecated [{}]: {} This will be removed after {}.",
$id, format!($($arg)*), $remove_at
);
}
}};
}
#[cfg(test)]
mod tests {
#[test]
fn warns_once_per_id() {
deprecated_at!("2000-01-01", "9999-01-01", "test-once", "old thing.");
deprecated_at!("2000-01-01", "9999-01-01", "test-once", "old thing.");
assert!(super::WARNED.lock().unwrap().contains("test-once"));
}
#[test]
fn silent_before_warn_version() {
deprecated_at!("9998-01-01", "9999-01-01", "test-future", "not yet.");
assert!(!super::WARNED.lock().unwrap().contains("test-future"));
}
}