pitchfork_cli/
deprecated.rs1use std::collections::HashSet;
8use std::sync::{LazyLock, Mutex};
9
10pub fn today() -> chrono::NaiveDate {
12 chrono::Utc::now().date_naive()
13}
14
15pub fn date(s: &str) -> chrono::NaiveDate {
17 chrono::NaiveDate::parse_from_str(s, "%Y-%m-%d")
18 .unwrap_or_else(|_| panic!("invalid date {s:?} in deprecated_at!, expected YYYY-MM-DD"))
19}
20
21pub static WARNED: LazyLock<Mutex<HashSet<String>>> = LazyLock::new(Default::default);
23
24#[macro_export]
39macro_rules! deprecated_at {
40 ($warn_at:expr, $remove_at:expr, $id:expr, $($arg:tt)*) => {{
41 let warn_date = $crate::deprecated::date($warn_at);
42 let remove_date = $crate::deprecated::date($remove_at);
43 let today = $crate::deprecated::today();
44 debug_assert!(
45 today < remove_date,
46 "Deprecated code [{}] should have been removed on {}. Please remove this deprecated functionality.",
47 $id, $remove_at
48 );
49 if today >= warn_date
50 && $crate::deprecated::WARNED.lock().unwrap().insert(($id).to_string())
51 {
52 ::log::warn!(
53 "deprecated [{}]: {} This will be removed after {}.",
54 $id, format!($($arg)*), $remove_at
55 );
56 }
57 }};
58}
59
60#[cfg(test)]
61mod tests {
62 #[test]
63 fn warns_once_per_id() {
64 deprecated_at!("2000-01-01", "9999-01-01", "test-once", "old thing.");
65 deprecated_at!("2000-01-01", "9999-01-01", "test-once", "old thing.");
66 assert!(super::WARNED.lock().unwrap().contains("test-once"));
67 }
68
69 #[test]
70 fn silent_before_warn_version() {
71 deprecated_at!("9998-01-01", "9999-01-01", "test-future", "not yet.");
72 assert!(!super::WARNED.lock().unwrap().contains("test-future"));
73 }
74}