use crate::{error::BuilderError, operator::Operator};
use aws_sdk_s3::config::{
Credentials, Region, RequestChecksumCalculation, ResponseChecksumValidation,
};
#[derive(Debug, Clone)]
pub struct Builder {
bucket_name: Option<String>,
access_key_id: Option<String>,
secret_access_key: Option<String>,
endpoint: Option<String>,
region: String,
}
impl Default for Builder {
fn default() -> Self {
Self {
bucket_name: None,
access_key_id: None,
secret_access_key: None,
endpoint: None,
region: "auto".to_string(),
}
}
}
impl Builder {
pub fn new() -> Self {
Self::default()
}
pub fn set_bucket_name(mut self, bucket_name: String) -> Self {
self.bucket_name = Some(bucket_name);
self
}
pub fn set_access_key_id(mut self, access_key_id: String) -> Self {
self.access_key_id = Some(access_key_id);
self
}
pub fn set_secret_access_key(mut self, secret_access_key: String) -> Self {
self.secret_access_key = Some(secret_access_key);
self
}
pub fn set_endpoint(mut self, endpoint: String) -> Self {
self.endpoint = Some(endpoint);
self
}
pub fn set_region(mut self, region: String) -> Self {
self.region = region;
self
}
#[deprecated(since = "3.1.0", note = "use create_client_result() instead")]
pub fn create_client(&self) -> Operator {
let credentials = Credentials::new(
self.access_key_id
.as_ref()
.expect("Access key id is not set."),
self.secret_access_key
.as_ref()
.expect("Secret access key is not set."),
None,
None,
"",
);
let config = aws_sdk_s3::config::Builder::new()
.credentials_provider(credentials)
.region(Region::new(self.region.clone()))
.endpoint_url(self.endpoint.as_ref().expect("Endpoint is not set."))
.clone()
.build();
Operator::new(
self.bucket_name.clone().expect("Bucket name is not set."),
aws_sdk_s3::Client::from_conf(config),
)
}
pub fn create_client_result(&self) -> Result<Operator, BuilderError> {
let bucket_name = match &self.bucket_name {
Some(bucket_name) => bucket_name.clone(),
None => Err(BuilderError::BucketNameNotSetError)?,
};
let access_key_id = match &self.access_key_id {
Some(access_key_id) => access_key_id,
None => Err(BuilderError::AccessKeyIdNotSetError)?,
};
let secret_access_key = match &self.secret_access_key {
Some(secret_access_key) => secret_access_key,
None => Err(BuilderError::SecretAccessKeyNotSetError)?,
};
let endpoint = match &self.endpoint {
Some(endpoint) => endpoint,
None => Err(BuilderError::EndpointNotSetError)?,
};
let credentials = Credentials::new(access_key_id, secret_access_key, None, None, "");
let config = aws_sdk_s3::config::Builder::new()
.credentials_provider(credentials)
.region(Region::new(self.region.clone()))
.endpoint_url(endpoint)
.set_request_checksum_calculation(Some(RequestChecksumCalculation::WhenRequired))
.set_response_checksum_validation(Some(ResponseChecksumValidation::WhenRequired))
.clone()
.build();
Ok(Operator::new(
bucket_name,
aws_sdk_s3::Client::from_conf(config),
))
}
}