use std::collections::HashSet;
use std::sync::Mutex;
use once_cell::sync::Lazy;
static SEEN: Lazy<Mutex<HashSet<String>>> = Lazy::new(|| Mutex::new(HashSet::new()));
pub const SUPPRESS_ENV: &str = "SCUV_SUPPRESS_DEPRECATION";
pub fn warn_once(message: &str) -> bool {
if std::env::var_os(SUPPRESS_ENV).is_some_and(|v| !v.is_empty()) {
return false;
}
let mut seen = SEEN.lock().expect("deprecation set poisoned");
if !seen.insert(message.to_string()) {
return false;
}
eprintln!("warning: {message}");
true
}
#[cfg(test)]
mod tests {
use super::*;
use serial_test::serial;
#[test]
#[serial]
fn warn_once_emits_then_suppresses() {
let _g = crate::test_utils::env_guard(&[(SUPPRESS_ENV, None)]);
assert!(warn_once("task1-test-msg-a"));
assert!(!warn_once("task1-test-msg-a"));
assert!(warn_once("task1-test-msg-b"));
}
#[test]
#[serial]
fn warn_once_respects_suppress_env() {
{
let _g = crate::test_utils::env_guard(&[(SUPPRESS_ENV, Some("1"))]);
assert!(!warn_once("suppress-env-msg"));
}
let _g = crate::test_utils::env_guard(&[(SUPPRESS_ENV, None)]);
assert!(warn_once("suppress-env-msg"));
}
#[test]
#[serial]
fn warn_once_treats_empty_suppress_env_as_unset() {
let _g = crate::test_utils::env_guard(&[(SUPPRESS_ENV, Some(""))]);
assert!(warn_once("suppress-env-empty-msg"));
}
}