in core/src/services/gcs/backend.rs [296:383]
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 endpoint and bucket name
let bucket = match self.bucket.is_empty() {
false => Ok(&self.bucket),
true => Err(
Error::new(ErrorKind::ConfigInvalid, "The bucket is misconfigured")
.with_operation("Builder::build")
.with_context("service", Scheme::Gcs),
),
}?;
// TODO: server side encryption
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::Gcs)
})?
};
let endpoint = self
.endpoint
.clone()
.unwrap_or_else(|| DEFAULT_GCS_ENDPOINT.to_string());
debug!("backend use endpoint: {endpoint}");
let mut cred_loader = GoogleCredentialLoader::default();
if let Some(cred) = &self.credential {
cred_loader = cred_loader.with_content(cred);
}
if let Some(cred) = &self.credential_path {
cred_loader = cred_loader.with_path(cred);
}
let scope = if let Some(scope) = &self.scope {
scope
} else {
DEFAULT_GCS_SCOPE
};
let mut token_loader = GoogleTokenLoader::new(scope, client.client());
if let Some(account) = &self.service_account {
token_loader = token_loader.with_service_account(account);
}
if let Ok(Some(cred)) = cred_loader.load() {
token_loader = token_loader.with_credentials(cred)
}
if let Some(loader) = self.customed_token_loader.take() {
token_loader = token_loader.with_customed_token_loader(loader)
}
let signer = GoogleSigner::new("storage");
let write_fixed_size = self.write_fixed_size.unwrap_or(DEFAULT_WRITE_FIXED_SIZE);
// GCS requires write must align with 256 KiB.
if write_fixed_size % (256 * 1024) != 0 {
return Err(Error::new(
ErrorKind::ConfigInvalid,
"The write fixed buffer size is misconfigured",
)
.with_context("service", Scheme::Gcs)
.with_context("write_fixed_size", write_fixed_size.to_string()));
}
let backend = GcsBackend {
core: Arc::new(GcsCore {
endpoint,
bucket: bucket.to_string(),
root,
client,
signer,
token_loader,
credential_loader: cred_loader,
predefined_acl: self.predefined_acl.clone(),
default_storage_class: self.default_storage_class.clone(),
write_fixed_size,
}),
};
Ok(backend)
}