use std::borrow::Cow;
use std::collections::HashMap;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::OnceLock;
static RENAMES: OnceLock<HashMap<String, String>> = OnceLock::new();
static ACTIVE: AtomicBool = AtomicBool::new(false);
pub fn set_class_renames(map: HashMap<String, String>) {
if !map.is_empty() {
ACTIVE.store(true, Ordering::Relaxed);
}
let _ = RENAMES.set(map);
}
#[inline]
pub fn apply_class_rename(internal: &str) -> Cow<'_, str> {
if !ACTIVE.load(Ordering::Relaxed) {
return Cow::Borrowed(internal);
}
let Some(map) = RENAMES.get() else {
return Cow::Borrowed(internal);
};
if let Some(d) = map.get(internal) {
return if d == internal {
Cow::Borrowed(internal)
} else {
Cow::Owned(d.clone())
};
}
let mut s = internal;
while let Some(i) = s.rfind('$') {
s = &s[..i];
match map.get(s) {
Some(d) if d != s => {
let suffix = &internal[s.len()..];
return Cow::Owned(format!("{d}{suffix}"));
}
Some(_) => return Cow::Borrowed(internal),
None => continue,
}
}
Cow::Borrowed(internal)
}