use regex::Regex;
use std::sync::LazyLock;
static ID_TAG_RE: LazyLock<Regex> = LazyLock::new(|| {
Regex::new(r"^[a-z0-9-][a-z0-9.-]{3,60}[a-z0-9-]$")
.unwrap_or_else(|e| unreachable!("ID_TAG_RE regex compilation failed: {}", e))
});
pub fn validate_id_tag(id_tag: &str) -> bool {
ID_TAG_RE.is_match(id_tag)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_validate_id_tag() {
assert!(validate_id_tag("alice"));
assert!(validate_id_tag("bob-123"));
assert!(validate_id_tag("user-name-123"));
assert!(validate_id_tag("home.w9.hu"));
assert!(!validate_id_tag("Al")); assert!(!validate_id_tag("Alice")); assert!(!validate_id_tag("alice_123")); }
#[test]
fn test_validate_id_tag_rejects_url_injection() {
assert!(!validate_id_tag("alice/../../etc"));
assert!(!validate_id_tag("alice/admin"));
assert!(!validate_id_tag("alice@evil.com"));
assert!(!validate_id_tag("alice:8080"));
assert!(!validate_id_tag("alice evil"));
assert!(!validate_id_tag("alice?x=1"));
assert!(!validate_id_tag("alice#frag"));
assert!(!validate_id_tag("alice\\evil"));
assert!(!validate_id_tag("")); }
}