use opendal::{services::S3, Operator};
use super::{opendal_adapter::OpendalAdapter, StoreDriver};
use crate::storage::StorageResult;
#[derive(Debug)]
pub struct Credential {
pub key_id: String,
pub secret_key: String,
pub token: Option<String>,
}
pub fn new(bucket_name: &str, region: &str) -> StorageResult<Box<dyn StoreDriver>> {
let s3 = S3::default().bucket(bucket_name).region(region);
Ok(Box::new(OpendalAdapter::new(Operator::new(s3)?.finish())))
}
pub fn with_credentials(
bucket_name: &str,
region: &str,
credentials: Credential,
) -> StorageResult<Box<dyn StoreDriver>> {
let mut s3 = S3::default()
.bucket(bucket_name)
.region(region)
.access_key_id(&credentials.key_id)
.secret_access_key(&credentials.secret_key);
if let Some(token) = credentials.token {
s3 = s3.session_token(&token);
}
Ok(Box::new(OpendalAdapter::new(Operator::new(s3)?.finish())))
}
#[cfg(test)]
#[must_use]
pub fn with_failure() -> Box<dyn StoreDriver> {
let s3 = S3::default()
.bucket("loco-test")
.region("ap-south-1")
.allow_anonymous()
.disable_ec2_metadata();
Box::new(OpendalAdapter::new(Operator::new(s3).unwrap().finish()))
}