use uuid::Uuid;
pub trait KeyGenerator: Send + Sync {
fn generate_key(&self, extension: &str, key_prefix: Option<&str>) -> String;
}
#[derive(Clone, Debug, Default)]
pub struct UuidKeyGenerator;
impl KeyGenerator for UuidKeyGenerator {
fn generate_key(&self, extension: &str, key_prefix: Option<&str>) -> String {
let ext = extension.trim_start_matches('.');
let id = Uuid::new_v4();
match key_prefix {
Some(prefix) => {
let prefix = prefix.trim().trim_matches('/');
if prefix.is_empty() {
format!("{}.{}", id, ext)
} else {
format!("{}/{}.{}", prefix, id, ext)
}
}
None => format!("{}.{}", id, ext),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_generate_key_with_prefix() {
let generator = UuidKeyGenerator;
let key = generator.generate_key("png", Some("uploads"));
assert!(key.starts_with("uploads/"));
assert!(key.ends_with(".png"));
}
#[test]
fn test_generate_key_without_prefix() {
let generator = UuidKeyGenerator;
let key = generator.generate_key("jpg", None);
assert!(!key.contains('/'));
assert!(key.ends_with(".jpg"));
}
}