pub fn sanitize_title(input: &str) -> Option<String> {
let collapsed: String = input
.chars()
.map(|c| if c.is_whitespace() { ' ' } else { c })
.collect();
let trimmed = collapsed.trim();
if trimmed.is_empty() {
return None;
}
let mut title = String::with_capacity(trimmed.len());
let mut prev_space = false;
for ch in trimmed.chars() {
let is_space = ch == ' ';
if is_space && prev_space {
continue;
}
title.push(ch);
prev_space = is_space;
}
Some(title)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn trims_and_keeps_text() {
assert_eq!(sanitize_title(" Мой чат ").as_deref(), Some("Мой чат"));
}
#[test]
fn empty_or_whitespace_is_rejected() {
assert_eq!(sanitize_title(""), None);
assert_eq!(sanitize_title(" \t\n "), None);
}
#[test]
fn collapses_internal_whitespace() {
assert_eq!(
sanitize_title("много \t пробелов\nи строк").as_deref(),
Some("много пробелов и строк")
);
}
#[test]
fn a_long_title_is_kept_whole() {
let long = "я".repeat(400);
assert_eq!(sanitize_title(&long).as_deref(), Some(long.as_str()));
}
}