#[cfg(test)]
use core::time::Duration;
use std::sync::Arc;
use object_store::{
aws::{AmazonS3Builder, AwsCredential},
StaticCredentialProvider,
};
#[cfg(test)]
use object_store::{BackoffConfig, RetryConfig};
use super::{object_store_adapter::ObjectStoreAdapter, StoreDriver};
use crate::Result;
#[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) -> Result<Box<dyn StoreDriver>> {
let s3 = AmazonS3Builder::new()
.with_bucket_name(bucket_name)
.with_region(region)
.build()
.map_err(Box::from)?;
Ok(Box::new(ObjectStoreAdapter::new(Box::new(s3))))
}
pub fn with_credentials(
bucket_name: &str,
region: &str,
credentials: Credential,
) -> Result<Box<dyn StoreDriver>> {
let s3 = AmazonS3Builder::new()
.with_bucket_name(bucket_name)
.with_region(region)
.with_credentials(Arc::new(StaticCredentialProvider::new(AwsCredential {
key_id: credentials.key_id.to_string(),
secret_key: credentials.secret_key.to_string(),
token: credentials.token,
})))
.build()
.map_err(Box::from)?;
Ok(Box::new(ObjectStoreAdapter::new(Box::new(s3))))
}
#[cfg(test)]
#[must_use]
pub fn with_failure() -> Box<dyn StoreDriver> {
let s3 = AmazonS3Builder::new()
.with_bucket_name("loco-test")
.with_retry(RetryConfig {
backoff: BackoffConfig::default(),
max_retries: 0,
retry_timeout: Duration::from_secs(0),
})
.build()
.unwrap();
Box::new(ObjectStoreAdapter::new(Box::new(s3)))
}