1use crate::generated::models::{
7 AccessTier, BlobClientAbortCopyOptions, BlobClientAcquireLeaseOptions,
8 BlobClientAcquireLeaseResult, BlobClientBreakLeaseOptions, BlobClientBreakLeaseResult,
9 BlobClientChangeLeaseOptions, BlobClientChangeLeaseResult, BlobClientCreateSnapshotOptions,
10 BlobClientCreateSnapshotResult, BlobClientDeleteImmutabilityPolicyOptions,
11 BlobClientDeleteOptions, BlobClientDownloadInternalOptions, BlobClientDownloadInternalResult,
12 BlobClientGetAccountInfoOptions, BlobClientGetAccountInfoResult,
13 BlobClientGetPropertiesOptions, BlobClientGetPropertiesResult, BlobClientGetTagsOptions,
14 BlobClientReleaseLeaseOptions, BlobClientReleaseLeaseResult, BlobClientRenewLeaseOptions,
15 BlobClientRenewLeaseResult, BlobClientSetImmutabilityPolicyOptions,
16 BlobClientSetLegalHoldOptions, BlobClientSetMetadataOptions, BlobClientSetPropertiesOptions,
17 BlobClientSetTagsOptions, BlobClientSetTierOptions, BlobClientStartCopyFromUrlOptions,
18 BlobClientStartCopyFromUrlResult, BlobClientUndeleteOptions, BlobTags,
19};
20use azure_core::{
21 base64,
22 error::CheckSuccessOptions,
23 fmt::SafeDebug,
24 http::{
25 AsyncResponse, ClientOptions, Method, NoFormat, Pipeline, PipelineSendOptions,
26 PipelineStreamOptions, Request, RequestContent, Response, Url, UrlExt, XmlFormat,
27 },
28 time::{to_rfc7231, OffsetDateTime},
29 tracing, Result,
30};
31use std::collections::HashMap;
32
33#[tracing::client]
34pub struct BlobClient {
35 pub(crate) endpoint: Url,
36 pub(crate) pipeline: Pipeline,
37 pub(crate) version: String,
38}
39
40#[derive(Clone, SafeDebug)]
42pub struct BlobClientOptions {
43 pub client_options: ClientOptions,
45 pub version: String,
47}
48
49impl BlobClient {
50 #[tracing::function("Storage.Blob.BlobClient.abortCopyFromUrl")]
57 pub async fn abort_copy(
58 &self,
59 copy_id: &str,
60 options: Option<BlobClientAbortCopyOptions<'_>>,
61 ) -> Result<Response<(), NoFormat>> {
62 let options = options.unwrap_or_default();
63 let ctx = options.method_options.context.to_borrowed();
64 let mut url = self.endpoint.clone();
65 let mut query_builder = url.query_builder();
66 query_builder.append_pair("comp", "copy");
67 query_builder.set_pair("copyid", copy_id);
68 if let Some(timeout) = options.timeout {
69 query_builder.set_pair("timeout", timeout.to_string());
70 }
71 query_builder.build();
72 let mut request = Request::new(url, Method::Put);
73 request.insert_header("x-ms-copy-action", "abort");
74 if let Some(lease_id) = options.lease_id.as_ref() {
75 request.insert_header("x-ms-lease-id", lease_id);
76 }
77 request.insert_header("x-ms-version", &self.version);
78 let rsp = self
79 .pipeline
80 .send(
81 &ctx,
82 &mut request,
83 Some(PipelineSendOptions {
84 check_success: CheckSuccessOptions {
85 success_codes: &[204],
86 },
87 ..Default::default()
88 }),
89 )
90 .await?;
91 Ok(rsp.into())
92 }
93
94 #[tracing::function("Storage.Blob.BlobClient.acquireLease")]
133 pub async fn acquire_lease(
134 &self,
135 duration: i32,
136 options: Option<BlobClientAcquireLeaseOptions<'_>>,
137 ) -> Result<Response<BlobClientAcquireLeaseResult, NoFormat>> {
138 let options = options.unwrap_or_default();
139 let ctx = options.method_options.context.to_borrowed();
140 let mut url = self.endpoint.clone();
141 let mut query_builder = url.query_builder();
142 query_builder.append_pair("comp", "lease");
143 if let Some(timeout) = options.timeout {
144 query_builder.set_pair("timeout", timeout.to_string());
145 }
146 query_builder.build();
147 let mut request = Request::new(url, Method::Put);
148 if let Some(if_match) = options.if_match.as_ref() {
149 request.insert_header("if-match", if_match.to_string());
150 }
151 if let Some(if_modified_since) = options.if_modified_since {
152 request.insert_header("if-modified-since", to_rfc7231(&if_modified_since));
153 }
154 if let Some(if_none_match) = options.if_none_match.as_ref() {
155 request.insert_header("if-none-match", if_none_match.to_string());
156 }
157 if let Some(if_unmodified_since) = options.if_unmodified_since {
158 request.insert_header("if-unmodified-since", to_rfc7231(&if_unmodified_since));
159 }
160 if let Some(if_tags) = options.if_tags.as_ref() {
161 request.insert_header("x-ms-if-tags", if_tags);
162 }
163 request.insert_header("x-ms-lease-action", "acquire");
164 request.insert_header("x-ms-lease-duration", duration.to_string());
165 if let Some(proposed_lease_id) = options.proposed_lease_id.as_ref() {
166 request.insert_header("x-ms-proposed-lease-id", proposed_lease_id);
167 }
168 request.insert_header("x-ms-version", &self.version);
169 let rsp = self
170 .pipeline
171 .send(
172 &ctx,
173 &mut request,
174 Some(PipelineSendOptions {
175 check_success: CheckSuccessOptions {
176 success_codes: &[201],
177 },
178 ..Default::default()
179 }),
180 )
181 .await?;
182 Ok(rsp.into())
183 }
184
185 #[tracing::function("Storage.Blob.BlobClient.breakLease")]
222 pub async fn break_lease(
223 &self,
224 options: Option<BlobClientBreakLeaseOptions<'_>>,
225 ) -> Result<Response<BlobClientBreakLeaseResult, NoFormat>> {
226 let options = options.unwrap_or_default();
227 let ctx = options.method_options.context.to_borrowed();
228 let mut url = self.endpoint.clone();
229 let mut query_builder = url.query_builder();
230 query_builder.append_pair("comp", "lease");
231 if let Some(timeout) = options.timeout {
232 query_builder.set_pair("timeout", timeout.to_string());
233 }
234 query_builder.build();
235 let mut request = Request::new(url, Method::Put);
236 if let Some(if_match) = options.if_match.as_ref() {
237 request.insert_header("if-match", if_match.to_string());
238 }
239 if let Some(if_modified_since) = options.if_modified_since {
240 request.insert_header("if-modified-since", to_rfc7231(&if_modified_since));
241 }
242 if let Some(if_none_match) = options.if_none_match.as_ref() {
243 request.insert_header("if-none-match", if_none_match.to_string());
244 }
245 if let Some(if_unmodified_since) = options.if_unmodified_since {
246 request.insert_header("if-unmodified-since", to_rfc7231(&if_unmodified_since));
247 }
248 if let Some(if_tags) = options.if_tags.as_ref() {
249 request.insert_header("x-ms-if-tags", if_tags);
250 }
251 request.insert_header("x-ms-lease-action", "break");
252 if let Some(break_period) = options.break_period {
253 request.insert_header("x-ms-lease-break-period", break_period.to_string());
254 }
255 request.insert_header("x-ms-version", &self.version);
256 let rsp = self
257 .pipeline
258 .send(
259 &ctx,
260 &mut request,
261 Some(PipelineSendOptions {
262 check_success: CheckSuccessOptions {
263 success_codes: &[202],
264 },
265 ..Default::default()
266 }),
267 )
268 .await?;
269 Ok(rsp.into())
270 }
271
272 #[tracing::function("Storage.Blob.BlobClient.changeLease")]
311 pub async fn change_lease(
312 &self,
313 lease_id: String,
314 proposed_lease_id: String,
315 options: Option<BlobClientChangeLeaseOptions<'_>>,
316 ) -> Result<Response<BlobClientChangeLeaseResult, NoFormat>> {
317 let options = options.unwrap_or_default();
318 let ctx = options.method_options.context.to_borrowed();
319 let mut url = self.endpoint.clone();
320 let mut query_builder = url.query_builder();
321 query_builder.append_pair("comp", "lease");
322 if let Some(timeout) = options.timeout {
323 query_builder.set_pair("timeout", timeout.to_string());
324 }
325 query_builder.build();
326 let mut request = Request::new(url, Method::Put);
327 if let Some(if_match) = options.if_match.as_ref() {
328 request.insert_header("if-match", if_match.to_string());
329 }
330 if let Some(if_modified_since) = options.if_modified_since {
331 request.insert_header("if-modified-since", to_rfc7231(&if_modified_since));
332 }
333 if let Some(if_none_match) = options.if_none_match.as_ref() {
334 request.insert_header("if-none-match", if_none_match.to_string());
335 }
336 if let Some(if_unmodified_since) = options.if_unmodified_since {
337 request.insert_header("if-unmodified-since", to_rfc7231(&if_unmodified_since));
338 }
339 if let Some(if_tags) = options.if_tags.as_ref() {
340 request.insert_header("x-ms-if-tags", if_tags);
341 }
342 request.insert_header("x-ms-lease-action", "change");
343 request.insert_header("x-ms-lease-id", lease_id);
344 request.insert_header("x-ms-proposed-lease-id", proposed_lease_id);
345 request.insert_header("x-ms-version", &self.version);
346 let rsp = self
347 .pipeline
348 .send(
349 &ctx,
350 &mut request,
351 Some(PipelineSendOptions {
352 check_success: CheckSuccessOptions {
353 success_codes: &[200],
354 },
355 ..Default::default()
356 }),
357 )
358 .await?;
359 Ok(rsp.into())
360 }
361
362 #[tracing::function("Storage.Blob.BlobClient.createSnapshot")]
401 pub async fn create_snapshot(
402 &self,
403 options: Option<BlobClientCreateSnapshotOptions<'_>>,
404 ) -> Result<Response<BlobClientCreateSnapshotResult, NoFormat>> {
405 let options = options.unwrap_or_default();
406 let ctx = options.method_options.context.to_borrowed();
407 let mut url = self.endpoint.clone();
408 let mut query_builder = url.query_builder();
409 query_builder.append_pair("comp", "snapshot");
410 if let Some(timeout) = options.timeout {
411 query_builder.set_pair("timeout", timeout.to_string());
412 }
413 query_builder.build();
414 let mut request = Request::new(url, Method::Put);
415 if let Some(if_match) = options.if_match.as_ref() {
416 request.insert_header("if-match", if_match.to_string());
417 }
418 if let Some(if_modified_since) = options.if_modified_since {
419 request.insert_header("if-modified-since", to_rfc7231(&if_modified_since));
420 }
421 if let Some(if_none_match) = options.if_none_match.as_ref() {
422 request.insert_header("if-none-match", if_none_match.to_string());
423 }
424 if let Some(if_unmodified_since) = options.if_unmodified_since {
425 request.insert_header("if-unmodified-since", to_rfc7231(&if_unmodified_since));
426 }
427 if let Some(encryption_algorithm) = options.encryption_algorithm.as_ref() {
428 request.insert_header(
429 "x-ms-encryption-algorithm",
430 encryption_algorithm.to_string(),
431 );
432 }
433 if let Some(encryption_key) = options.encryption_key.as_ref() {
434 request.insert_header("x-ms-encryption-key", encryption_key);
435 }
436 if let Some(encryption_key_sha256) = options.encryption_key_sha256.as_ref() {
437 request.insert_header("x-ms-encryption-key-sha256", encryption_key_sha256);
438 }
439 if let Some(encryption_scope) = options.encryption_scope.as_ref() {
440 request.insert_header("x-ms-encryption-scope", encryption_scope);
441 }
442 if let Some(if_tags) = options.if_tags.as_ref() {
443 request.insert_header("x-ms-if-tags", if_tags);
444 }
445 if let Some(lease_id) = options.lease_id.as_ref() {
446 request.insert_header("x-ms-lease-id", lease_id);
447 }
448 if let Some(metadata) = options.metadata.as_ref() {
449 for (k, v) in metadata {
450 request.insert_header(format!("x-ms-meta-{k}"), v);
451 }
452 }
453 request.insert_header("x-ms-version", &self.version);
454 let rsp = self
455 .pipeline
456 .send(
457 &ctx,
458 &mut request,
459 Some(PipelineSendOptions {
460 check_success: CheckSuccessOptions {
461 success_codes: &[201],
462 },
463 ..Default::default()
464 }),
465 )
466 .await?;
467 Ok(rsp.into())
468 }
469
470 #[tracing::function("Storage.Blob.BlobClient.delete")]
477 pub async fn delete(
478 &self,
479 options: Option<BlobClientDeleteOptions<'_>>,
480 ) -> Result<Response<(), NoFormat>> {
481 let options = options.unwrap_or_default();
482 let ctx = options.method_options.context.to_borrowed();
483 let mut url = self.endpoint.clone();
484 let mut query_builder = url.query_builder();
485 if let Some(blob_delete_type) = options.blob_delete_type.as_ref() {
486 query_builder.set_pair("deletetype", blob_delete_type.as_ref());
487 }
488 if let Some(snapshot) = options.snapshot.as_ref() {
489 query_builder.set_pair("snapshot", snapshot);
490 }
491 if let Some(timeout) = options.timeout {
492 query_builder.set_pair("timeout", timeout.to_string());
493 }
494 if let Some(version_id) = options.version_id.as_ref() {
495 query_builder.set_pair("versionid", version_id);
496 }
497 query_builder.build();
498 let mut request = Request::new(url, Method::Delete);
499 if let Some(if_match) = options.if_match.as_ref() {
500 request.insert_header("if-match", if_match.to_string());
501 }
502 if let Some(if_modified_since) = options.if_modified_since {
503 request.insert_header("if-modified-since", to_rfc7231(&if_modified_since));
504 }
505 if let Some(if_none_match) = options.if_none_match.as_ref() {
506 request.insert_header("if-none-match", if_none_match.to_string());
507 }
508 if let Some(if_unmodified_since) = options.if_unmodified_since {
509 request.insert_header("if-unmodified-since", to_rfc7231(&if_unmodified_since));
510 }
511 if let Some(access_tier_if_modified_since) = options.access_tier_if_modified_since {
512 request.insert_header(
513 "x-ms-access-tier-if-modified-since",
514 to_rfc7231(&access_tier_if_modified_since),
515 );
516 }
517 if let Some(access_tier_if_unmodified_since) = options.access_tier_if_unmodified_since {
518 request.insert_header(
519 "x-ms-access-tier-if-unmodified-since",
520 to_rfc7231(&access_tier_if_unmodified_since),
521 );
522 }
523 if let Some(delete_snapshots) = options.delete_snapshots.as_ref() {
524 request.insert_header("x-ms-delete-snapshots", delete_snapshots.to_string());
525 }
526 if let Some(if_tags) = options.if_tags.as_ref() {
527 request.insert_header("x-ms-if-tags", if_tags);
528 }
529 if let Some(lease_id) = options.lease_id.as_ref() {
530 request.insert_header("x-ms-lease-id", lease_id);
531 }
532 request.insert_header("x-ms-version", &self.version);
533 let rsp = self
534 .pipeline
535 .send(
536 &ctx,
537 &mut request,
538 Some(PipelineSendOptions {
539 check_success: CheckSuccessOptions {
540 success_codes: &[202],
541 },
542 ..Default::default()
543 }),
544 )
545 .await?;
546 Ok(rsp.into())
547 }
548
549 #[tracing::function("Storage.Blob.BlobClient.deleteImmutabilityPolicy")]
555 pub async fn delete_immutability_policy(
556 &self,
557 options: Option<BlobClientDeleteImmutabilityPolicyOptions<'_>>,
558 ) -> Result<Response<(), NoFormat>> {
559 let options = options.unwrap_or_default();
560 let ctx = options.method_options.context.to_borrowed();
561 let mut url = self.endpoint.clone();
562 let mut query_builder = url.query_builder();
563 query_builder.append_pair("comp", "immutabilityPolicies");
564 if let Some(snapshot) = options.snapshot.as_ref() {
565 query_builder.set_pair("snapshot", snapshot);
566 }
567 if let Some(timeout) = options.timeout {
568 query_builder.set_pair("timeout", timeout.to_string());
569 }
570 if let Some(version_id) = options.version_id.as_ref() {
571 query_builder.set_pair("versionid", version_id);
572 }
573 query_builder.build();
574 let mut request = Request::new(url, Method::Delete);
575 request.insert_header("x-ms-version", &self.version);
576 let rsp = self
577 .pipeline
578 .send(
579 &ctx,
580 &mut request,
581 Some(PipelineSendOptions {
582 check_success: CheckSuccessOptions {
583 success_codes: &[200],
584 },
585 ..Default::default()
586 }),
587 )
588 .await?;
589 Ok(rsp.into())
590 }
591
592 #[tracing::function("Storage.Blob.BlobClient.download")]
664 pub(crate) async fn download_internal(
665 &self,
666 options: Option<BlobClientDownloadInternalOptions<'_>>,
667 ) -> Result<AsyncResponse<BlobClientDownloadInternalResult>> {
668 let options = options.unwrap_or_default();
669 let ctx = options.method_options.context.to_borrowed();
670 let mut url = self.endpoint.clone();
671 let mut query_builder = url.query_builder();
672 if let Some(snapshot) = options.snapshot.as_ref() {
673 query_builder.set_pair("snapshot", snapshot);
674 }
675 if let Some(timeout) = options.timeout {
676 query_builder.set_pair("timeout", timeout.to_string());
677 }
678 if let Some(version_id) = options.version_id.as_ref() {
679 query_builder.set_pair("versionid", version_id);
680 }
681 query_builder.build();
682 let mut request = Request::new(url, Method::Get);
683 request.insert_header("accept", "application/octet-stream");
684 if let Some(if_match) = options.if_match.as_ref() {
685 request.insert_header("if-match", if_match.to_string());
686 }
687 if let Some(if_modified_since) = options.if_modified_since {
688 request.insert_header("if-modified-since", to_rfc7231(&if_modified_since));
689 }
690 if let Some(if_none_match) = options.if_none_match.as_ref() {
691 request.insert_header("if-none-match", if_none_match.to_string());
692 }
693 if let Some(if_unmodified_since) = options.if_unmodified_since {
694 request.insert_header("if-unmodified-since", to_rfc7231(&if_unmodified_since));
695 }
696 if let Some(range) = options.range.as_ref() {
697 request.insert_header("range", range.to_string());
698 }
699 if let Some(encryption_algorithm) = options.encryption_algorithm.as_ref() {
700 request.insert_header(
701 "x-ms-encryption-algorithm",
702 encryption_algorithm.to_string(),
703 );
704 }
705 if let Some(encryption_key) = options.encryption_key.as_ref() {
706 request.insert_header("x-ms-encryption-key", encryption_key);
707 }
708 if let Some(encryption_key_sha256) = options.encryption_key_sha256.as_ref() {
709 request.insert_header("x-ms-encryption-key-sha256", encryption_key_sha256);
710 }
711 if let Some(if_tags) = options.if_tags.as_ref() {
712 request.insert_header("x-ms-if-tags", if_tags);
713 }
714 if let Some(lease_id) = options.lease_id.as_ref() {
715 request.insert_header("x-ms-lease-id", lease_id);
716 }
717 if let Some(range_get_content_crc64) = options.range_get_content_crc64 {
718 request.insert_header(
719 "x-ms-range-get-content-crc64",
720 range_get_content_crc64.to_string(),
721 );
722 }
723 if let Some(range_get_content_md5) = options.range_get_content_md5 {
724 request.insert_header(
725 "x-ms-range-get-content-md5",
726 range_get_content_md5.to_string(),
727 );
728 }
729 if let Some(structured_body_type) = options.structured_body_type.as_ref() {
730 request.insert_header("x-ms-structured-body", structured_body_type);
731 }
732 request.insert_header("x-ms-version", &self.version);
733 let rsp = self
734 .pipeline
735 .stream(
736 &ctx,
737 &mut request,
738 Some(PipelineStreamOptions {
739 check_success: CheckSuccessOptions {
740 success_codes: &[200, 206],
741 },
742 ..Default::default()
743 }),
744 )
745 .await?;
746 Ok(rsp.into())
747 }
748
749 #[tracing::function("Storage.Blob.BlobClient.getAccountInfo")]
786 pub async fn get_account_info(
787 &self,
788 options: Option<BlobClientGetAccountInfoOptions<'_>>,
789 ) -> Result<Response<BlobClientGetAccountInfoResult, NoFormat>> {
790 let options = options.unwrap_or_default();
791 let ctx = options.method_options.context.to_borrowed();
792 let mut url = self.endpoint.clone();
793 let mut query_builder = url.query_builder();
794 query_builder
795 .append_pair("comp", "properties")
796 .append_pair("restype", "account");
797 if let Some(timeout) = options.timeout {
798 query_builder.set_pair("timeout", timeout.to_string());
799 }
800 query_builder.build();
801 let mut request = Request::new(url, Method::Get);
802 request.insert_header("x-ms-version", &self.version);
803 let rsp = self
804 .pipeline
805 .send(
806 &ctx,
807 &mut request,
808 Some(PipelineSendOptions {
809 check_success: CheckSuccessOptions {
810 success_codes: &[200],
811 },
812 ..Default::default()
813 }),
814 )
815 .await?;
816 Ok(rsp.into())
817 }
818
819 #[tracing::function("Storage.Blob.BlobClient.getProperties")]
898 pub async fn get_properties(
899 &self,
900 options: Option<BlobClientGetPropertiesOptions<'_>>,
901 ) -> Result<Response<BlobClientGetPropertiesResult, NoFormat>> {
902 let options = options.unwrap_or_default();
903 let ctx = options.method_options.context.to_borrowed();
904 let mut url = self.endpoint.clone();
905 let mut query_builder = url.query_builder();
906 if let Some(snapshot) = options.snapshot.as_ref() {
907 query_builder.set_pair("snapshot", snapshot);
908 }
909 if let Some(timeout) = options.timeout {
910 query_builder.set_pair("timeout", timeout.to_string());
911 }
912 if let Some(version_id) = options.version_id.as_ref() {
913 query_builder.set_pair("versionid", version_id);
914 }
915 query_builder.build();
916 let mut request = Request::new(url, Method::Head);
917 if let Some(if_match) = options.if_match.as_ref() {
918 request.insert_header("if-match", if_match.to_string());
919 }
920 if let Some(if_modified_since) = options.if_modified_since {
921 request.insert_header("if-modified-since", to_rfc7231(&if_modified_since));
922 }
923 if let Some(if_none_match) = options.if_none_match.as_ref() {
924 request.insert_header("if-none-match", if_none_match.to_string());
925 }
926 if let Some(if_unmodified_since) = options.if_unmodified_since {
927 request.insert_header("if-unmodified-since", to_rfc7231(&if_unmodified_since));
928 }
929 if let Some(encryption_algorithm) = options.encryption_algorithm.as_ref() {
930 request.insert_header(
931 "x-ms-encryption-algorithm",
932 encryption_algorithm.to_string(),
933 );
934 }
935 if let Some(encryption_key) = options.encryption_key.as_ref() {
936 request.insert_header("x-ms-encryption-key", encryption_key);
937 }
938 if let Some(encryption_key_sha256) = options.encryption_key_sha256.as_ref() {
939 request.insert_header("x-ms-encryption-key-sha256", encryption_key_sha256);
940 }
941 if let Some(if_tags) = options.if_tags.as_ref() {
942 request.insert_header("x-ms-if-tags", if_tags);
943 }
944 if let Some(lease_id) = options.lease_id.as_ref() {
945 request.insert_header("x-ms-lease-id", lease_id);
946 }
947 request.insert_header("x-ms-version", &self.version);
948 let rsp = self
949 .pipeline
950 .send(
951 &ctx,
952 &mut request,
953 Some(PipelineSendOptions {
954 check_success: CheckSuccessOptions {
955 success_codes: &[200],
956 },
957 ..Default::default()
958 }),
959 )
960 .await?;
961 Ok(rsp.into())
962 }
963
964 #[tracing::function("Storage.Blob.BlobClient.getTags")]
970 pub async fn get_tags(
971 &self,
972 options: Option<BlobClientGetTagsOptions<'_>>,
973 ) -> Result<Response<BlobTags, XmlFormat>> {
974 let options = options.unwrap_or_default();
975 let ctx = options.method_options.context.to_borrowed();
976 let mut url = self.endpoint.clone();
977 let mut query_builder = url.query_builder();
978 query_builder.append_pair("comp", "tags");
979 if let Some(snapshot) = options.snapshot.as_ref() {
980 query_builder.set_pair("snapshot", snapshot);
981 }
982 if let Some(timeout) = options.timeout {
983 query_builder.set_pair("timeout", timeout.to_string());
984 }
985 if let Some(version_id) = options.version_id.as_ref() {
986 query_builder.set_pair("versionid", version_id);
987 }
988 query_builder.build();
989 let mut request = Request::new(url, Method::Get);
990 request.insert_header("accept", "application/xml");
991 if let Some(if_match) = options.if_match.as_ref() {
992 request.insert_header("x-ms-blob-if-match", if_match.to_string());
993 }
994 if let Some(if_modified_since) = options.if_modified_since {
995 request.insert_header(
996 "x-ms-blob-if-modified-since",
997 to_rfc7231(&if_modified_since),
998 );
999 }
1000 if let Some(if_none_match) = options.if_none_match.as_ref() {
1001 request.insert_header("x-ms-blob-if-none-match", if_none_match.to_string());
1002 }
1003 if let Some(if_unmodified_since) = options.if_unmodified_since {
1004 request.insert_header(
1005 "x-ms-blob-if-unmodified-since",
1006 to_rfc7231(&if_unmodified_since),
1007 );
1008 }
1009 if let Some(if_tags) = options.if_tags.as_ref() {
1010 request.insert_header("x-ms-if-tags", if_tags);
1011 }
1012 if let Some(lease_id) = options.lease_id.as_ref() {
1013 request.insert_header("x-ms-lease-id", lease_id);
1014 }
1015 request.insert_header("x-ms-version", &self.version);
1016 let rsp = self
1017 .pipeline
1018 .send(
1019 &ctx,
1020 &mut request,
1021 Some(PipelineSendOptions {
1022 check_success: CheckSuccessOptions {
1023 success_codes: &[200],
1024 },
1025 ..Default::default()
1026 }),
1027 )
1028 .await?;
1029 Ok(rsp.into())
1030 }
1031
1032 #[tracing::function("Storage.Blob.BlobClient.releaseLease")]
1066 pub async fn release_lease(
1067 &self,
1068 lease_id: String,
1069 options: Option<BlobClientReleaseLeaseOptions<'_>>,
1070 ) -> Result<Response<BlobClientReleaseLeaseResult, NoFormat>> {
1071 let options = options.unwrap_or_default();
1072 let ctx = options.method_options.context.to_borrowed();
1073 let mut url = self.endpoint.clone();
1074 let mut query_builder = url.query_builder();
1075 query_builder.append_pair("comp", "lease");
1076 if let Some(timeout) = options.timeout {
1077 query_builder.set_pair("timeout", timeout.to_string());
1078 }
1079 query_builder.build();
1080 let mut request = Request::new(url, Method::Put);
1081 if let Some(if_match) = options.if_match.as_ref() {
1082 request.insert_header("if-match", if_match.to_string());
1083 }
1084 if let Some(if_modified_since) = options.if_modified_since {
1085 request.insert_header("if-modified-since", to_rfc7231(&if_modified_since));
1086 }
1087 if let Some(if_none_match) = options.if_none_match.as_ref() {
1088 request.insert_header("if-none-match", if_none_match.to_string());
1089 }
1090 if let Some(if_unmodified_since) = options.if_unmodified_since {
1091 request.insert_header("if-unmodified-since", to_rfc7231(&if_unmodified_since));
1092 }
1093 if let Some(if_tags) = options.if_tags.as_ref() {
1094 request.insert_header("x-ms-if-tags", if_tags);
1095 }
1096 request.insert_header("x-ms-lease-action", "release");
1097 request.insert_header("x-ms-lease-id", lease_id);
1098 request.insert_header("x-ms-version", &self.version);
1099 let rsp = self
1100 .pipeline
1101 .send(
1102 &ctx,
1103 &mut request,
1104 Some(PipelineSendOptions {
1105 check_success: CheckSuccessOptions {
1106 success_codes: &[200],
1107 },
1108 ..Default::default()
1109 }),
1110 )
1111 .await?;
1112 Ok(rsp.into())
1113 }
1114
1115 #[tracing::function("Storage.Blob.BlobClient.renewLease")]
1153 pub async fn renew_lease(
1154 &self,
1155 lease_id: String,
1156 options: Option<BlobClientRenewLeaseOptions<'_>>,
1157 ) -> Result<Response<BlobClientRenewLeaseResult, NoFormat>> {
1158 let options = options.unwrap_or_default();
1159 let ctx = options.method_options.context.to_borrowed();
1160 let mut url = self.endpoint.clone();
1161 let mut query_builder = url.query_builder();
1162 query_builder.append_pair("comp", "lease");
1163 if let Some(timeout) = options.timeout {
1164 query_builder.set_pair("timeout", timeout.to_string());
1165 }
1166 query_builder.build();
1167 let mut request = Request::new(url, Method::Put);
1168 if let Some(if_match) = options.if_match.as_ref() {
1169 request.insert_header("if-match", if_match.to_string());
1170 }
1171 if let Some(if_modified_since) = options.if_modified_since {
1172 request.insert_header("if-modified-since", to_rfc7231(&if_modified_since));
1173 }
1174 if let Some(if_none_match) = options.if_none_match.as_ref() {
1175 request.insert_header("if-none-match", if_none_match.to_string());
1176 }
1177 if let Some(if_unmodified_since) = options.if_unmodified_since {
1178 request.insert_header("if-unmodified-since", to_rfc7231(&if_unmodified_since));
1179 }
1180 if let Some(if_tags) = options.if_tags.as_ref() {
1181 request.insert_header("x-ms-if-tags", if_tags);
1182 }
1183 request.insert_header("x-ms-lease-action", "renew");
1184 request.insert_header("x-ms-lease-id", lease_id);
1185 request.insert_header("x-ms-version", &self.version);
1186 let rsp = self
1187 .pipeline
1188 .send(
1189 &ctx,
1190 &mut request,
1191 Some(PipelineSendOptions {
1192 check_success: CheckSuccessOptions {
1193 success_codes: &[200],
1194 },
1195 ..Default::default()
1196 }),
1197 )
1198 .await?;
1199 Ok(rsp.into())
1200 }
1201
1202 #[tracing::function("Storage.Blob.BlobClient.setImmutabilityPolicy")]
1209 pub async fn set_immutability_policy(
1210 &self,
1211 expiry: &OffsetDateTime,
1212 options: Option<BlobClientSetImmutabilityPolicyOptions<'_>>,
1213 ) -> Result<Response<(), NoFormat>> {
1214 let options = options.unwrap_or_default();
1215 let ctx = options.method_options.context.to_borrowed();
1216 let mut url = self.endpoint.clone();
1217 let mut query_builder = url.query_builder();
1218 query_builder.append_pair("comp", "immutabilityPolicies");
1219 if let Some(snapshot) = options.snapshot.as_ref() {
1220 query_builder.set_pair("snapshot", snapshot);
1221 }
1222 if let Some(timeout) = options.timeout {
1223 query_builder.set_pair("timeout", timeout.to_string());
1224 }
1225 if let Some(version_id) = options.version_id.as_ref() {
1226 query_builder.set_pair("versionid", version_id);
1227 }
1228 query_builder.build();
1229 let mut request = Request::new(url, Method::Put);
1230 if let Some(if_unmodified_since) = options.if_unmodified_since {
1231 request.insert_header("if-unmodified-since", to_rfc7231(&if_unmodified_since));
1232 }
1233 if let Some(immutability_policy_mode) = options.immutability_policy_mode.as_ref() {
1234 request.insert_header(
1235 "x-ms-immutability-policy-mode",
1236 immutability_policy_mode.to_string(),
1237 );
1238 }
1239 request.insert_header("x-ms-immutability-policy-until-date", to_rfc7231(expiry));
1240 request.insert_header("x-ms-version", &self.version);
1241 let rsp = self
1242 .pipeline
1243 .send(
1244 &ctx,
1245 &mut request,
1246 Some(PipelineSendOptions {
1247 check_success: CheckSuccessOptions {
1248 success_codes: &[200],
1249 },
1250 ..Default::default()
1251 }),
1252 )
1253 .await?;
1254 Ok(rsp.into())
1255 }
1256
1257 #[tracing::function("Storage.Blob.BlobClient.setLegalHold")]
1264 pub async fn set_legal_hold(
1265 &self,
1266 legal_hold: bool,
1267 options: Option<BlobClientSetLegalHoldOptions<'_>>,
1268 ) -> Result<Response<(), NoFormat>> {
1269 let options = options.unwrap_or_default();
1270 let ctx = options.method_options.context.to_borrowed();
1271 let mut url = self.endpoint.clone();
1272 let mut query_builder = url.query_builder();
1273 query_builder.append_pair("comp", "legalhold");
1274 if let Some(snapshot) = options.snapshot.as_ref() {
1275 query_builder.set_pair("snapshot", snapshot);
1276 }
1277 if let Some(timeout) = options.timeout {
1278 query_builder.set_pair("timeout", timeout.to_string());
1279 }
1280 if let Some(version_id) = options.version_id.as_ref() {
1281 query_builder.set_pair("versionid", version_id);
1282 }
1283 query_builder.build();
1284 let mut request = Request::new(url, Method::Put);
1285 request.insert_header("x-ms-legal-hold", legal_hold.to_string());
1286 request.insert_header("x-ms-version", &self.version);
1287 let rsp = self
1288 .pipeline
1289 .send(
1290 &ctx,
1291 &mut request,
1292 Some(PipelineSendOptions {
1293 check_success: CheckSuccessOptions {
1294 success_codes: &[200],
1295 },
1296 ..Default::default()
1297 }),
1298 )
1299 .await?;
1300 Ok(rsp.into())
1301 }
1302
1303 #[tracing::function("Storage.Blob.BlobClient.setMetadata")]
1310 pub async fn set_metadata(
1311 &self,
1312 metadata: &HashMap<String, String>,
1313 options: Option<BlobClientSetMetadataOptions<'_>>,
1314 ) -> Result<Response<(), NoFormat>> {
1315 let options = options.unwrap_or_default();
1316 let ctx = options.method_options.context.to_borrowed();
1317 let mut url = self.endpoint.clone();
1318 let mut query_builder = url.query_builder();
1319 query_builder.append_pair("comp", "metadata");
1320 if let Some(timeout) = options.timeout {
1321 query_builder.set_pair("timeout", timeout.to_string());
1322 }
1323 query_builder.build();
1324 let mut request = Request::new(url, Method::Put);
1325 if let Some(if_match) = options.if_match.as_ref() {
1326 request.insert_header("if-match", if_match.to_string());
1327 }
1328 if let Some(if_modified_since) = options.if_modified_since {
1329 request.insert_header("if-modified-since", to_rfc7231(&if_modified_since));
1330 }
1331 if let Some(if_none_match) = options.if_none_match.as_ref() {
1332 request.insert_header("if-none-match", if_none_match.to_string());
1333 }
1334 if let Some(if_unmodified_since) = options.if_unmodified_since {
1335 request.insert_header("if-unmodified-since", to_rfc7231(&if_unmodified_since));
1336 }
1337 if let Some(encryption_algorithm) = options.encryption_algorithm.as_ref() {
1338 request.insert_header(
1339 "x-ms-encryption-algorithm",
1340 encryption_algorithm.to_string(),
1341 );
1342 }
1343 if let Some(encryption_key) = options.encryption_key.as_ref() {
1344 request.insert_header("x-ms-encryption-key", encryption_key);
1345 }
1346 if let Some(encryption_key_sha256) = options.encryption_key_sha256.as_ref() {
1347 request.insert_header("x-ms-encryption-key-sha256", encryption_key_sha256);
1348 }
1349 if let Some(encryption_scope) = options.encryption_scope.as_ref() {
1350 request.insert_header("x-ms-encryption-scope", encryption_scope);
1351 }
1352 if let Some(if_tags) = options.if_tags.as_ref() {
1353 request.insert_header("x-ms-if-tags", if_tags);
1354 }
1355 if let Some(lease_id) = options.lease_id.as_ref() {
1356 request.insert_header("x-ms-lease-id", lease_id);
1357 }
1358 for (k, v) in metadata {
1359 request.insert_header(format!("x-ms-meta-{k}"), v);
1360 }
1361 request.insert_header("x-ms-version", &self.version);
1362 let rsp = self
1363 .pipeline
1364 .send(
1365 &ctx,
1366 &mut request,
1367 Some(PipelineSendOptions {
1368 check_success: CheckSuccessOptions {
1369 success_codes: &[200],
1370 },
1371 ..Default::default()
1372 }),
1373 )
1374 .await?;
1375 Ok(rsp.into())
1376 }
1377
1378 #[tracing::function("Storage.Blob.BlobClient.setProperties")]
1384 pub async fn set_properties(
1385 &self,
1386 options: Option<BlobClientSetPropertiesOptions<'_>>,
1387 ) -> Result<Response<(), NoFormat>> {
1388 let options = options.unwrap_or_default();
1389 let ctx = options.method_options.context.to_borrowed();
1390 let mut url = self.endpoint.clone();
1391 let mut query_builder = url.query_builder();
1392 query_builder.append_pair("comp", "properties");
1393 if let Some(timeout) = options.timeout {
1394 query_builder.set_pair("timeout", timeout.to_string());
1395 }
1396 query_builder.build();
1397 let mut request = Request::new(url, Method::Put);
1398 if let Some(if_match) = options.if_match.as_ref() {
1399 request.insert_header("if-match", if_match.to_string());
1400 }
1401 if let Some(if_modified_since) = options.if_modified_since {
1402 request.insert_header("if-modified-since", to_rfc7231(&if_modified_since));
1403 }
1404 if let Some(if_none_match) = options.if_none_match.as_ref() {
1405 request.insert_header("if-none-match", if_none_match.to_string());
1406 }
1407 if let Some(if_unmodified_since) = options.if_unmodified_since {
1408 request.insert_header("if-unmodified-since", to_rfc7231(&if_unmodified_since));
1409 }
1410 if let Some(blob_cache_control) = options.blob_cache_control.as_ref() {
1411 request.insert_header("x-ms-blob-cache-control", blob_cache_control);
1412 }
1413 if let Some(blob_content_disposition) = options.blob_content_disposition.as_ref() {
1414 request.insert_header("x-ms-blob-content-disposition", blob_content_disposition);
1415 }
1416 if let Some(blob_content_encoding) = options.blob_content_encoding.as_ref() {
1417 request.insert_header("x-ms-blob-content-encoding", blob_content_encoding);
1418 }
1419 if let Some(blob_content_language) = options.blob_content_language.as_ref() {
1420 request.insert_header("x-ms-blob-content-language", blob_content_language);
1421 }
1422 if let Some(blob_content_md5) = options.blob_content_md5 {
1423 request.insert_header("x-ms-blob-content-md5", base64::encode(blob_content_md5));
1424 }
1425 if let Some(blob_content_type) = options.blob_content_type.as_ref() {
1426 request.insert_header("x-ms-blob-content-type", blob_content_type);
1427 }
1428 if let Some(if_tags) = options.if_tags.as_ref() {
1429 request.insert_header("x-ms-if-tags", if_tags);
1430 }
1431 if let Some(lease_id) = options.lease_id.as_ref() {
1432 request.insert_header("x-ms-lease-id", lease_id);
1433 }
1434 request.insert_header("x-ms-version", &self.version);
1435 let rsp = self
1436 .pipeline
1437 .send(
1438 &ctx,
1439 &mut request,
1440 Some(PipelineSendOptions {
1441 check_success: CheckSuccessOptions {
1442 success_codes: &[200],
1443 },
1444 ..Default::default()
1445 }),
1446 )
1447 .await?;
1448 Ok(rsp.into())
1449 }
1450
1451 #[tracing::function("Storage.Blob.BlobClient.setTags")]
1458 pub async fn set_tags(
1459 &self,
1460 tags: RequestContent<BlobTags, XmlFormat>,
1461 options: Option<BlobClientSetTagsOptions<'_>>,
1462 ) -> Result<Response<(), NoFormat>> {
1463 let options = options.unwrap_or_default();
1464 let ctx = options.method_options.context.to_borrowed();
1465 let mut url = self.endpoint.clone();
1466 let mut query_builder = url.query_builder();
1467 query_builder.append_pair("comp", "tags");
1468 if let Some(timeout) = options.timeout {
1469 query_builder.set_pair("timeout", timeout.to_string());
1470 }
1471 if let Some(version_id) = options.version_id.as_ref() {
1472 query_builder.set_pair("versionid", version_id);
1473 }
1474 query_builder.build();
1475 let mut request = Request::new(url, Method::Put);
1476 if let Some(transactional_content_md5) = options.transactional_content_md5 {
1477 request.insert_header("content-md5", base64::encode(transactional_content_md5));
1478 }
1479 request.insert_header("content-type", "application/xml");
1480 if let Some(if_match) = options.if_match.as_ref() {
1481 request.insert_header("x-ms-blob-if-match", if_match.to_string());
1482 }
1483 if let Some(if_modified_since) = options.if_modified_since {
1484 request.insert_header(
1485 "x-ms-blob-if-modified-since",
1486 to_rfc7231(&if_modified_since),
1487 );
1488 }
1489 if let Some(if_none_match) = options.if_none_match.as_ref() {
1490 request.insert_header("x-ms-blob-if-none-match", if_none_match.to_string());
1491 }
1492 if let Some(if_unmodified_since) = options.if_unmodified_since {
1493 request.insert_header(
1494 "x-ms-blob-if-unmodified-since",
1495 to_rfc7231(&if_unmodified_since),
1496 );
1497 }
1498 if let Some(transactional_content_crc64) = options.transactional_content_crc64 {
1499 request.insert_header(
1500 "x-ms-content-crc64",
1501 base64::encode(transactional_content_crc64),
1502 );
1503 }
1504 if let Some(if_tags) = options.if_tags.as_ref() {
1505 request.insert_header("x-ms-if-tags", if_tags);
1506 }
1507 if let Some(lease_id) = options.lease_id.as_ref() {
1508 request.insert_header("x-ms-lease-id", lease_id);
1509 }
1510 request.insert_header("x-ms-version", &self.version);
1511 request.set_body(tags);
1512 let rsp = self
1513 .pipeline
1514 .send(
1515 &ctx,
1516 &mut request,
1517 Some(PipelineSendOptions {
1518 check_success: CheckSuccessOptions {
1519 success_codes: &[204],
1520 },
1521 ..Default::default()
1522 }),
1523 )
1524 .await?;
1525 Ok(rsp.into())
1526 }
1527
1528 #[tracing::function("Storage.Blob.BlobClient.setTier")]
1535 pub async fn set_tier(
1536 &self,
1537 tier: AccessTier,
1538 options: Option<BlobClientSetTierOptions<'_>>,
1539 ) -> Result<Response<(), NoFormat>> {
1540 let options = options.unwrap_or_default();
1541 let ctx = options.method_options.context.to_borrowed();
1542 let mut url = self.endpoint.clone();
1543 let mut query_builder = url.query_builder();
1544 query_builder.append_pair("comp", "tier");
1545 if let Some(snapshot) = options.snapshot.as_ref() {
1546 query_builder.set_pair("snapshot", snapshot);
1547 }
1548 if let Some(timeout) = options.timeout {
1549 query_builder.set_pair("timeout", timeout.to_string());
1550 }
1551 if let Some(version_id) = options.version_id.as_ref() {
1552 query_builder.set_pair("versionid", version_id);
1553 }
1554 query_builder.build();
1555 let mut request = Request::new(url, Method::Put);
1556 request.insert_header("x-ms-access-tier", tier.to_string());
1557 if let Some(if_tags) = options.if_tags.as_ref() {
1558 request.insert_header("x-ms-if-tags", if_tags);
1559 }
1560 if let Some(lease_id) = options.lease_id.as_ref() {
1561 request.insert_header("x-ms-lease-id", lease_id);
1562 }
1563 if let Some(rehydrate_priority) = options.rehydrate_priority.as_ref() {
1564 request.insert_header("x-ms-rehydrate-priority", rehydrate_priority.to_string());
1565 }
1566 request.insert_header("x-ms-version", &self.version);
1567 let rsp = self
1568 .pipeline
1569 .send(
1570 &ctx,
1571 &mut request,
1572 Some(PipelineSendOptions {
1573 check_success: CheckSuccessOptions {
1574 success_codes: &[200, 202],
1575 },
1576 ..Default::default()
1577 }),
1578 )
1579 .await?;
1580 Ok(rsp.into())
1581 }
1582
1583 #[tracing::function("Storage.Blob.BlobClient.startCopyFromUrl")]
1624 pub async fn start_copy_from_url(
1625 &self,
1626 copy_source: String,
1627 options: Option<BlobClientStartCopyFromUrlOptions<'_>>,
1628 ) -> Result<Response<BlobClientStartCopyFromUrlResult, NoFormat>> {
1629 let options = options.unwrap_or_default();
1630 let ctx = options.method_options.context.to_borrowed();
1631 let mut url = self.endpoint.clone();
1632 let mut query_builder = url.query_builder();
1633 if let Some(timeout) = options.timeout {
1634 query_builder.set_pair("timeout", timeout.to_string());
1635 }
1636 query_builder.build();
1637 let mut request = Request::new(url, Method::Put);
1638 if let Some(if_match) = options.if_match.as_ref() {
1639 request.insert_header("if-match", if_match.to_string());
1640 }
1641 if let Some(if_modified_since) = options.if_modified_since {
1642 request.insert_header("if-modified-since", to_rfc7231(&if_modified_since));
1643 }
1644 if let Some(if_none_match) = options.if_none_match.as_ref() {
1645 request.insert_header("if-none-match", if_none_match.to_string());
1646 }
1647 if let Some(if_unmodified_since) = options.if_unmodified_since {
1648 request.insert_header("if-unmodified-since", to_rfc7231(&if_unmodified_since));
1649 }
1650 if let Some(tier) = options.tier.as_ref() {
1651 request.insert_header("x-ms-access-tier", tier.to_string());
1652 }
1653 request.insert_header("x-ms-copy-source", copy_source);
1654 if let Some(if_tags) = options.if_tags.as_ref() {
1655 request.insert_header("x-ms-if-tags", if_tags);
1656 }
1657 if let Some(immutability_policy_mode) = options.immutability_policy_mode.as_ref() {
1658 request.insert_header(
1659 "x-ms-immutability-policy-mode",
1660 immutability_policy_mode.to_string(),
1661 );
1662 }
1663 if let Some(immutability_policy_expiry) = options.immutability_policy_expiry {
1664 request.insert_header(
1665 "x-ms-immutability-policy-until-date",
1666 to_rfc7231(&immutability_policy_expiry),
1667 );
1668 }
1669 if let Some(lease_id) = options.lease_id.as_ref() {
1670 request.insert_header("x-ms-lease-id", lease_id);
1671 }
1672 if let Some(legal_hold) = options.legal_hold {
1673 request.insert_header("x-ms-legal-hold", legal_hold.to_string());
1674 }
1675 if let Some(metadata) = options.metadata.as_ref() {
1676 for (k, v) in metadata {
1677 request.insert_header(format!("x-ms-meta-{k}"), v);
1678 }
1679 }
1680 if let Some(rehydrate_priority) = options.rehydrate_priority.as_ref() {
1681 request.insert_header("x-ms-rehydrate-priority", rehydrate_priority.to_string());
1682 }
1683 if let Some(seal_blob) = options.seal_blob {
1684 request.insert_header("x-ms-seal-blob", seal_blob.to_string());
1685 }
1686 if let Some(source_if_match) = options.source_if_match.as_ref() {
1687 request.insert_header("x-ms-source-if-match", source_if_match.to_string());
1688 }
1689 if let Some(source_if_modified_since) = options.source_if_modified_since {
1690 request.insert_header(
1691 "x-ms-source-if-modified-since",
1692 to_rfc7231(&source_if_modified_since),
1693 );
1694 }
1695 if let Some(source_if_none_match) = options.source_if_none_match.as_ref() {
1696 request.insert_header(
1697 "x-ms-source-if-none-match",
1698 source_if_none_match.to_string(),
1699 );
1700 }
1701 if let Some(source_if_tags) = options.source_if_tags.as_ref() {
1702 request.insert_header("x-ms-source-if-tags", source_if_tags);
1703 }
1704 if let Some(source_if_unmodified_since) = options.source_if_unmodified_since {
1705 request.insert_header(
1706 "x-ms-source-if-unmodified-since",
1707 to_rfc7231(&source_if_unmodified_since),
1708 );
1709 }
1710 if let Some(blob_tags_string) = options.blob_tags_string.as_ref() {
1711 request.insert_header("x-ms-tags", blob_tags_string);
1712 }
1713 request.insert_header("x-ms-version", &self.version);
1714 let rsp = self
1715 .pipeline
1716 .send(
1717 &ctx,
1718 &mut request,
1719 Some(PipelineSendOptions {
1720 check_success: CheckSuccessOptions {
1721 success_codes: &[202],
1722 },
1723 ..Default::default()
1724 }),
1725 )
1726 .await?;
1727 Ok(rsp.into())
1728 }
1729
1730 #[tracing::function("Storage.Blob.BlobClient.undelete")]
1736 pub async fn undelete(
1737 &self,
1738 options: Option<BlobClientUndeleteOptions<'_>>,
1739 ) -> Result<Response<(), NoFormat>> {
1740 let options = options.unwrap_or_default();
1741 let ctx = options.method_options.context.to_borrowed();
1742 let mut url = self.endpoint.clone();
1743 let mut query_builder = url.query_builder();
1744 query_builder.append_pair("comp", "undelete");
1745 if let Some(timeout) = options.timeout {
1746 query_builder.set_pair("timeout", timeout.to_string());
1747 }
1748 query_builder.build();
1749 let mut request = Request::new(url, Method::Put);
1750 request.insert_header("x-ms-version", &self.version);
1751 let rsp = self
1752 .pipeline
1753 .send(
1754 &ctx,
1755 &mut request,
1756 Some(PipelineSendOptions {
1757 check_success: CheckSuccessOptions {
1758 success_codes: &[200],
1759 },
1760 ..Default::default()
1761 }),
1762 )
1763 .await?;
1764 Ok(rsp.into())
1765 }
1766}
1767
1768pub(crate) const DEFAULT_VERSION: &str = "2026-04-06";
1770
1771impl Default for BlobClientOptions {
1772 fn default() -> Self {
1773 Self {
1774 client_options: ClientOptions::default(),
1775 version: String::from(DEFAULT_VERSION),
1776 }
1777 }
1778}