use crate::mcp_traits::IdGenerator;
use base64::Engine;
use std::sync::atomic::{AtomicU64, Ordering};
pub struct FastIdGenerator {
counter: AtomicU64,
prefix: &'static str,
}
impl FastIdGenerator {
pub fn new(prefix: Option<&'static str>) -> Self {
FastIdGenerator {
counter: AtomicU64::new(0),
prefix: prefix.unwrap_or_default(),
}
}
}
impl<T> IdGenerator<T> for FastIdGenerator
where
T: From<String>,
{
fn generate(&self) -> T {
let id = self.counter.fetch_add(1, Ordering::Relaxed);
let bytes = id.to_le_bytes();
let encoded = base64::engine::general_purpose::URL_SAFE_NO_PAD.encode(bytes);
if self.prefix.is_empty() {
T::from(encoded)
} else {
T::from(format!("{}{}", self.prefix, encoded))
}
}
}