garage-sdk 0.1.1

Async Rust SDK for Garage S3-compatible storage with uploads and public URL generation
Documentation
use uuid::Uuid;

/// Generates object keys for uploaded files.
pub trait KeyGenerator: Send + Sync {
    /// Generate a key from a file extension and an optional prefix.
    fn generate_key(&self, extension: &str, key_prefix: Option<&str>) -> String;
}

/// Default key generator using UUID v4.
#[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"));
    }
}