garage_sdk/keygen/
generator.rs1use uuid::Uuid;
2
3pub trait KeyGenerator: Send + Sync {
5 fn generate_key(&self, extension: &str, key_prefix: Option<&str>) -> String;
7}
8
9#[derive(Clone, Debug, Default)]
11pub struct UuidKeyGenerator;
12
13impl KeyGenerator for UuidKeyGenerator {
14 fn generate_key(&self, extension: &str, key_prefix: Option<&str>) -> String {
15 let ext = extension.trim_start_matches('.');
16 let id = Uuid::new_v4();
17
18 match key_prefix {
19 Some(prefix) => {
20 let prefix = prefix.trim().trim_matches('/');
21 if prefix.is_empty() {
22 format!("{}.{}", id, ext)
23 } else {
24 format!("{}/{}.{}", prefix, id, ext)
25 }
26 }
27 None => format!("{}.{}", id, ext),
28 }
29 }
30}
31
32#[cfg(test)]
33mod tests {
34 use super::*;
35
36 #[test]
37 fn test_generate_key_with_prefix() {
38 let generator = UuidKeyGenerator;
39 let key = generator.generate_key("png", Some("uploads"));
40 assert!(key.starts_with("uploads/"));
41 assert!(key.ends_with(".png"));
42 }
43
44 #[test]
45 fn test_generate_key_without_prefix() {
46 let generator = UuidKeyGenerator;
47 let key = generator.generate_key("jpg", None);
48 assert!(!key.contains('/'));
49 assert!(key.ends_with(".jpg"));
50 }
51}