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}