garage_sdk/keygen/
generator.rs

1use uuid::Uuid;
2
3/// Generates object keys for uploaded files.
4pub trait KeyGenerator: Send + Sync {
5    /// Generate a key from a file extension and an optional prefix.
6    fn generate_key(&self, extension: &str, key_prefix: Option<&str>) -> String;
7}
8
9/// Default key generator using UUID v4.
10#[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}