e034b46
use std::any::type_name;
pub fn topic_for_type<T>(prefix: &str) -> String {
let raw = type_name::<T>();
format!("{prefix}.{}", sanitize_topic_component(raw))
}
pub fn sanitize_topic_component(raw: &str) -> String {
let mut out = String::with_capacity(raw.len());
let mut last_was_underscore = false;
for ch in raw.chars() {
let allowed = ch.is_ascii_alphanumeric() || ch == '.' || ch == '-';
if allowed {
out.push(ch);
last_was_underscore = false;
} else if !last_was_underscore {
out.push('_');
last_was_underscore = true;
}
}
let trimmed = out.trim_matches('_').to_string();
if trimmed.is_empty() {
"unknown".to_string()
} else {
trimmed
}
}