use std::any::type_name; pub fn topic_for_type(prefix: &str) -> String { let raw = type_name::(); 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 } }