pub use crate::generated::clients::AppendBlobClient;
use crate::{logging::apply_storage_logging_defaults, pipeline::StorageHeadersPolicy};
use azure_core::{
credentials::TokenCredential,
fmt::SafeDebug,
http::{
policies::{auth::BearerTokenAuthorizationPolicy, Policy},
ClientOptions, Pipeline, Url,
},
tracing, Result,
};
use std::sync::Arc;
#[derive(Clone, SafeDebug)]
pub struct AppendBlobClientOptions {
pub client_options: ClientOptions,
pub version: String,
}
impl Default for AppendBlobClientOptions {
fn default() -> Self {
Self {
client_options: ClientOptions::default(),
version: String::from("2026-04-06"),
}
}
}
impl AppendBlobClient {
pub fn new(
endpoint: &str,
container_name: &str,
blob_name: &str,
credential: Option<Arc<dyn TokenCredential>>,
options: Option<AppendBlobClientOptions>,
) -> Result<Self> {
let mut url = Url::parse(endpoint)?;
{
let mut path_segments = url.path_segments_mut().map_err(|_| {
azure_core::Error::with_message(
azure_core::error::ErrorKind::Other,
"Invalid endpoint URL: Failed to parse out path segments from provided endpoint URL.",
)
})?;
path_segments.extend([container_name, blob_name]);
}
Self::from_url(url, credential, options)
}
#[tracing::new("Storage.Blob.AppendBlob")]
pub fn from_url(
blob_url: Url,
credential: Option<Arc<dyn TokenCredential>>,
options: Option<AppendBlobClientOptions>,
) -> Result<Self> {
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);
let per_retry_policies = if let Some(token_credential) = credential {
if !blob_url.scheme().starts_with("https") {
return Err(azure_core::Error::with_message(
azure_core::error::ErrorKind::Other,
format!("{blob_url} must use https"),
));
}
let auth_policy: Arc<dyn Policy> = Arc::new(BearerTokenAuthorizationPolicy::new(
token_credential,
vec!["https://storage.azure.com/.default"],
));
vec![auth_policy]
} else {
Vec::default()
};
let pipeline = Pipeline::new(
option_env!("CARGO_PKG_NAME"),
option_env!("CARGO_PKG_VERSION"),
options.client_options.clone(),
Vec::default(),
per_retry_policies,
None,
);
Ok(Self {
endpoint: blob_url,
version: options.version,
pipeline,
})
}
pub fn url(&self) -> &Url {
&self.endpoint
}
}