use crate::config::ProtocolConfig;
use rand::RngExt;
pub fn generate_room_code_with_config(config: &ProtocolConfig) -> String {
const ALPHANUMERIC_CHARS: &[u8] = b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
let mut rng = rand::rng();
(0..config.room_code_length)
.map(|_| {
let idx = rng.random_range(0..ALPHANUMERIC_CHARS.len());
ALPHANUMERIC_CHARS[idx] as char
})
.collect()
}
pub fn generate_clean_room_code_with_config(config: &ProtocolConfig) -> String {
generate_clean_room_code_of_length(config.room_code_length)
}
pub fn generate_clean_room_code_of_length(length: usize) -> String {
const CLEAN_CHARS: &[u8] = b"23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
if length == 0 {
return String::new();
}
let mut rng = rand::rng();
(0..length)
.map(|_| {
let idx = rng.random_range(0..CLEAN_CHARS.len());
CLEAN_CHARS[idx] as char
})
.collect()
}
pub fn generate_region_room_code(config: &ProtocolConfig, region_prefix: Option<&str>) -> String {
let normalized_prefix = region_prefix
.map(|p| p.trim().to_ascii_uppercase())
.filter(|p| !p.is_empty());
if let Some(prefix) = normalized_prefix {
let prefix_len = prefix.chars().count();
if prefix_len >= config.room_code_length {
tracing::warn!(
prefix_len,
room_code_length = config.room_code_length,
"Room code prefix is greater than or equal to total room code length; falling back to random codes without prefix"
);
return generate_clean_room_code_with_config(config);
}
let random_len = config.room_code_length - prefix_len;
let random_segment = generate_clean_room_code_of_length(random_len);
format!("{prefix}{random_segment}")
} else {
generate_clean_room_code_with_config(config)
}
}
#[allow(dead_code)]
pub fn generate_room_code() -> String {
let cfg = ProtocolConfig::default();
generate_room_code_with_config(&cfg)
}
pub fn generate_clean_room_code() -> String {
let cfg = ProtocolConfig::default();
generate_clean_room_code_with_config(&cfg)
}