1use crate::{error::BuilderError, operator::Operator};
2use aws_sdk_s3::config::{
3 Credentials, Region, RequestChecksumCalculation, ResponseChecksumValidation,
4};
5
6#[derive(Debug, Clone)]
41pub struct Builder {
42 bucket_name: Option<String>,
43 access_key_id: Option<String>,
44 secret_access_key: Option<String>,
45 endpoint: Option<String>,
46 region: String,
47}
48
49impl Default for Builder {
50 fn default() -> Self {
51 Self {
52 bucket_name: None,
53 access_key_id: None,
54 secret_access_key: None,
55 endpoint: None,
56 region: "auto".to_string(),
57 }
58 }
59}
60
61impl Builder {
62 pub fn new() -> Self {
63 Self::default()
67 }
68
69 pub fn set_bucket_name(mut self, bucket_name: String) -> Self {
70 self.bucket_name = Some(bucket_name);
72 self
73 }
74
75 pub fn set_access_key_id(mut self, access_key_id: String) -> Self {
76 self.access_key_id = Some(access_key_id);
78 self
79 }
80
81 pub fn set_secret_access_key(mut self, secret_access_key: String) -> Self {
82 self.secret_access_key = Some(secret_access_key);
84 self
85 }
86
87 pub fn set_endpoint(mut self, endpoint: String) -> Self {
88 self.endpoint = Some(endpoint);
90 self
91 }
92
93 pub fn set_region(mut self, region: String) -> Self {
94 self.region = region;
96 self
97 }
98
99 #[deprecated(since = "3.1.0", note = "use create_client_result() instead")]
100 pub fn create_client(&self) -> Operator {
101 let credentials = Credentials::new(
103 self.access_key_id
104 .as_ref()
105 .expect("Access key id is not set."),
106 self.secret_access_key
107 .as_ref()
108 .expect("Secret access key is not set."),
109 None,
110 None,
111 "",
112 );
113
114 let config = aws_sdk_s3::config::Builder::new()
115 .credentials_provider(credentials)
116 .region(Region::new(self.region.clone()))
117 .endpoint_url(self.endpoint.as_ref().expect("Endpoint is not set."))
118 .set_request_checksum_calculation(Some(RequestChecksumCalculation::WhenRequired))
119 .set_response_checksum_validation(Some(ResponseChecksumValidation::WhenRequired))
120 .clone()
121 .build();
122
123 Operator::new(
124 self.bucket_name.clone().expect("Bucket name is not set."),
125 aws_sdk_s3::Client::from_conf(config),
126 )
127 }
128
129 pub fn create_client_result(&self) -> Result<Operator, BuilderError> {
130 let bucket_name = match &self.bucket_name {
132 Some(bucket_name) => bucket_name.clone(),
133 None => Err(BuilderError::BucketNameNotSetError)?,
134 };
135 let access_key_id = match &self.access_key_id {
136 Some(access_key_id) => access_key_id,
137 None => Err(BuilderError::AccessKeyIdNotSetError)?,
138 };
139 let secret_access_key = match &self.secret_access_key {
140 Some(secret_access_key) => secret_access_key,
141 None => Err(BuilderError::SecretAccessKeyNotSetError)?,
142 };
143 let endpoint = match &self.endpoint {
144 Some(endpoint) => endpoint,
145 None => Err(BuilderError::EndpointNotSetError)?,
146 };
147
148 let credentials = Credentials::new(access_key_id, secret_access_key, None, None, "");
149
150 let config = aws_sdk_s3::config::Builder::new()
151 .credentials_provider(credentials)
152 .region(Region::new(self.region.clone()))
153 .endpoint_url(endpoint)
154 .set_request_checksum_calculation(Some(RequestChecksumCalculation::WhenRequired))
155 .set_response_checksum_validation(Some(ResponseChecksumValidation::WhenRequired))
156 .clone()
157 .build();
158
159 Ok(Operator::new(
160 bucket_name,
161 aws_sdk_s3::Client::from_conf(config),
162 ))
163 }
164}