auth_framework/utils/
string.rs

1//! String utility functions for the AuthFramework.
2
3use rand::{Rng, rng};
4
5/// Generate a random ID with optional prefix
6pub fn generate_id(prefix: Option<&str>) -> String {
7    const CHARSET: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ\
8                             abcdefghijklmnopqrstuvwxyz\
9                             0123456789";
10    let random_part: String = (0..16)
11        .map(|_| {
12            let idx = rng().random_range(0..CHARSET.len());
13            CHARSET[idx] as char
14        })
15        .collect();
16    
17    match prefix {
18        Some(p) => format!("{}_{}", p, random_part),
19        None => random_part,
20    }
21}/// Generate a UUID-like string
22pub fn generate_uuid() -> String {
23    uuid::Uuid::new_v4().to_string()
24}
25
26/// Sanitize a string for safe use in IDs or filenames
27pub fn sanitize_string(input: &str) -> String {
28    input
29        .chars()
30        .filter(|c| c.is_alphanumeric() || *c == '_' || *c == '-')
31        .collect()
32}
33
34#[cfg(test)]
35mod tests {
36    use super::*;
37
38    #[test]
39    fn test_generate_id() {
40        let id = generate_id(None);
41        assert_eq!(id.len(), 16);
42
43        let prefixed_id = generate_id(Some("test"));
44        assert!(prefixed_id.starts_with("test_"));
45        assert_eq!(prefixed_id.len(), 21); // "test_" + 16 chars
46    }
47
48    #[test]
49    fn test_generate_uuid() {
50        let uuid = generate_uuid();
51        assert_eq!(uuid.len(), 36); // Standard UUID length
52        assert!(uuid.contains('-'));
53    }
54
55    #[test]
56    fn test_sanitize_string() {
57        let input = "hello@world!#$%";
58        let sanitized = sanitize_string(input);
59        assert_eq!(sanitized, "helloworld");
60    }
61}