this_me/utils/
validate_input.rs

1use std::io;
2
3pub fn validate_alias(alias: &str) -> io::Result<()> {
4    println!("🔍 Validating alias: '{}' (chars: {}, bytes: {})", alias, alias.chars().count(), alias.len());
5
6    let alias_len = alias.len();
7    if alias_len < 5 || alias_len > 21 {
8        return Err(io::Error::new(io::ErrorKind::InvalidInput, "❌ Alias must be 5-21 characters long."));
9    }
10
11    if alias.starts_with('.') || alias.starts_with('_') {
12        return Err(io::Error::new(io::ErrorKind::InvalidInput, "❌ Alias cannot start with '.' or '_'"));
13    }
14
15    if alias.ends_with('.') || alias.ends_with('_') {
16        return Err(io::Error::new(io::ErrorKind::InvalidInput, "❌ Alias cannot end with '.' or '_'"));
17    }
18
19    if alias.contains("..") || alias.contains("__") || alias.contains("._") || alias.contains("_.") {
20        return Err(io::Error::new(io::ErrorKind::InvalidInput, "❌ Alias cannot contain consecutive '.' or '_'"));
21    }
22
23    if !alias.chars().all(|c| c.is_ascii_alphanumeric() || c == '.' || c == '_') {
24        return Err(io::Error::new(io::ErrorKind::InvalidInput, "❌ Alias must only contain letters, numbers, '.' or '_'"));
25    }
26
27    let period_count = alias.matches('.').count();
28    if period_count > 2 {
29        return Err(io::Error::new(io::ErrorKind::InvalidInput, "❌ Alias cannot have more than 2 periods."));
30    }
31
32    Ok(())
33}
34pub fn validate_hash(hash: &str) -> io::Result<()> {
35    if hash.len() < 4 {
36        return Err(io::Error::new(io::ErrorKind::InvalidInput, "❌ Hash (password) must be at least 4 characters long."));
37    }
38    Ok(())
39}