Skip to main content

rust_mcp_extra/id_generator/
nano_id_generator.rs

1//! Short (Smaller than UUID), URL-safe, Customizable alphabet, Cryptographically secure
2
3use nanoid::nanoid;
4use rust_mcp_sdk::id_generator::IdGenerator;
5
6/// A NanoID-based ID generator that produces short, URL-safe, unique strings.
7///
8/// This generator is well-suited for cases where:
9/// - You want compact, human-friendly IDs
10/// - UUIDs are too long or verbose
11/// - You don't need time-based or ordered IDs
12///
13/// Internally uses the `nanoid` crate to generate secure, random IDs.
14///
15/// # Example
16/// ```
17/// use rust_mcp_extra::{id_generator::NanoIdGenerator,IdGenerator};
18///
19/// let generator = NanoIdGenerator::new(10);
20/// let id: String = generator.generate();
21/// println!("Generated ID: {}", id);
22/// assert_eq!(id.len(), 10);
23/// ```
24pub struct NanoIdGenerator {
25    size: usize, // number of characters in the ID
26}
27
28impl NanoIdGenerator {
29    /// Creates a new Nano ID generator.
30    ///
31    /// # Arguments
32    /// * `size` - Length of the generated ID (default: 21 if unsure)
33    pub fn new(size: usize) -> Self {
34        Self { size }
35    }
36}
37
38impl<T> IdGenerator<T> for NanoIdGenerator
39where
40    T: From<String>,
41{
42    fn generate(&self) -> T {
43        let size = self.size;
44        let id = nanoid!(size);
45        T::from(id)
46    }
47}
48
49#[cfg(test)]
50mod tests {
51    use super::*;
52
53    #[test]
54    fn generates_correct_length_id() {
55        let generator = NanoIdGenerator::new(12);
56        let id: String = generator.generate();
57        assert_eq!(id.len(), 12);
58    }
59
60    #[test]
61    fn generates_unique_ids() {
62        let generator = NanoIdGenerator::new(8);
63        let mut seen = std::collections::HashSet::new();
64
65        for _ in 0..1000 {
66            let id: String = generator.generate();
67            assert!(seen.insert(id.clone()), "Duplicate ID: {id}");
68        }
69    }
70}