pub use crate::generated::clients::{BlobServiceClient, BlobServiceClientOptions};
use crate::{
logging::apply_storage_logging_defaults, pipeline::StorageHeadersPolicy, BlobClient,
BlobContainerClient,
};
use azure_core::{
credentials::TokenCredential,
http::{
policies::{auth::BearerTokenAuthorizationPolicy, Policy},
Pipeline, Url,
},
tracing, Result,
};
use std::sync::Arc;
impl BlobServiceClient {
#[tracing::new("Storage.Blob.Service")]
pub fn new(
endpoint: &str,
credential: Option<Arc<dyn TokenCredential>>,
options: Option<BlobServiceClientOptions>,
) -> Result<Self> {
let endpoint = Url::parse(endpoint)?;
let mut options = options.unwrap_or_default();
apply_storage_logging_defaults(&mut options.client_options);
let storage_headers_policy = Arc::new(StorageHeadersPolicy);
options
.client_options
.per_call_policies
.push(storage_headers_policy);
if let Some(token_credential) = credential {
if !endpoint.scheme().starts_with("https") {
return Err(azure_core::Error::with_message(
azure_core::error::ErrorKind::Other,
format!("{endpoint} must use https"),
));
}
let auth_policy: Arc<dyn Policy> = Arc::new(BearerTokenAuthorizationPolicy::new(
token_credential,
vec!["https://storage.azure.com/.default"],
));
options.client_options.per_try_policies.push(auth_policy);
}
let pipeline = Pipeline::new(
option_env!("CARGO_PKG_NAME"),
option_env!("CARGO_PKG_VERSION"),
options.client_options.clone(),
Vec::default(),
Vec::default(),
None,
);
Ok(Self {
endpoint,
version: options.version,
pipeline,
})
}
pub fn blob_container_client(&self, container_name: &str) -> BlobContainerClient {
let mut container_url = self.url().clone();
container_url
.path_segments_mut()
.expect("Cannot be a base URL.")
.push(container_name);
BlobContainerClient {
endpoint: container_url,
pipeline: self.pipeline.clone(),
version: self.version.clone(),
tracer: self.tracer.clone(),
}
}
pub fn blob_client(&self, container_name: &str, blob_name: &str) -> BlobClient {
let mut blob_url = self.url().clone();
blob_url
.path_segments_mut()
.expect("Cannot be a base URL.")
.extend([container_name, blob_name]);
BlobClient {
endpoint: blob_url,
pipeline: self.pipeline.clone(),
version: self.version.clone(),
tracer: self.tracer.clone(),
}
}
pub fn url(&self) -> &Url {
&self.endpoint
}
}