in core/src/services/wasabi/backend.rs [743:881]
fn build(&mut self) -> Result<Self::Accessor> {
debug!("backend build started: {:?}", &self);
let root = normalize_root(&self.root.take().unwrap_or_default());
debug!("backend use root {}", &root);
// Handle bucket name.
let bucket = if self.is_bucket_valid() {
Ok(&self.bucket)
} else {
Err(
Error::new(ErrorKind::ConfigInvalid, "The bucket is misconfigured")
.with_context("service", Scheme::S3),
)
}?;
debug!("backend use bucket {}", &bucket);
let default_storage_class = match &self.default_storage_class {
None => None,
Some(v) => Some(
build_header_value(v).map_err(|err| err.with_context("key", "storage_class"))?,
),
};
let server_side_encryption = match &self.server_side_encryption {
None => None,
Some(v) => Some(
build_header_value(v)
.map_err(|err| err.with_context("key", "server_side_encryption"))?,
),
};
let server_side_encryption_aws_kms_key_id =
match &self.server_side_encryption_aws_kms_key_id {
None => None,
Some(v) => Some(build_header_value(v).map_err(|err| {
err.with_context("key", "server_side_encryption_aws_kms_key_id")
})?),
};
let server_side_encryption_customer_algorithm =
match &self.server_side_encryption_customer_algorithm {
None => None,
Some(v) => Some(build_header_value(v).map_err(|err| {
err.with_context("key", "server_side_encryption_customer_algorithm")
})?),
};
let server_side_encryption_customer_key =
match &self.server_side_encryption_customer_key {
None => None,
Some(v) => Some(build_header_value(v).map_err(|err| {
err.with_context("key", "server_side_encryption_customer_key")
})?),
};
let server_side_encryption_customer_key_md5 =
match &self.server_side_encryption_customer_key_md5 {
None => None,
Some(v) => Some(build_header_value(v).map_err(|err| {
err.with_context("key", "server_side_encryption_customer_key_md5")
})?),
};
let client = if let Some(client) = self.http_client.take() {
client
} else {
HttpClient::new().map_err(|err| {
err.with_operation("Builder::build")
.with_context("service", Scheme::S3)
})?
};
let mut cfg = AwsConfig::default();
if !self.disable_config_load {
cfg = cfg.from_profile();
cfg = cfg.from_env();
}
// Setting all value from user input if available.
if let Some(v) = self.region.take() {
cfg.region = Some(v);
}
if let Some(v) = self.access_key_id.take() {
cfg.access_key_id = Some(v)
}
if let Some(v) = self.secret_access_key.take() {
cfg.secret_access_key = Some(v)
}
if let Some(v) = self.security_token.take() {
cfg.session_token = Some(v)
}
if let Some(v) = self.role_arn.take() {
cfg.role_arn = Some(v)
}
if let Some(v) = self.external_id.take() {
cfg.external_id = Some(v)
}
if cfg.region.is_none() {
// region is required to make signer work.
//
// If we don't know region after loading from builder and env.
// We will use `us-east-1` as default.
cfg.region = Some("us-east-1".to_string());
}
let region = cfg.region.to_owned().unwrap();
debug!("backend use region: {region}");
// Building endpoint.
let endpoint = self.build_endpoint(®ion);
debug!("backend use endpoint: {endpoint}");
let mut loader = AwsDefaultLoader::new(client.client(), cfg);
if self.disable_ec2_metadata {
loader = loader.with_disable_ec2_metadata();
}
let signer = AwsV4Signer::new("s3", ®ion);
debug!("backend build finished");
Ok(WasabiBackend {
core: Arc::new(WasabiCore {
bucket: bucket.to_string(),
endpoint,
root,
server_side_encryption,
server_side_encryption_aws_kms_key_id,
server_side_encryption_customer_algorithm,
server_side_encryption_customer_key,
server_side_encryption_customer_key_md5,
default_storage_class,
signer,
loader,
client,
}),
})
}