azure_storage_blobs/blob/operations/
copy_blob.rs

1use crate::{
2    blob::{copy_status_from_headers, CopyStatus},
3    prelude::*,
4};
5use azure_core::{headers::*, prelude::*, RequestId, Url};
6use azure_storage::{copy_id_from_headers, CopyId};
7use time::OffsetDateTime;
8
9operation! {
10    CopyBlob,
11    client: BlobClient,
12    source_url: Url,
13    ?metadata: Metadata,
14    ?if_sequence_number: IfSequenceNumber,
15    ?if_modified_since: IfModifiedSinceCondition,
16    ?if_match: IfMatchCondition,
17    ?if_tags: IfTags,
18    ?access_tier: AccessTier,
19    ?lease_id: LeaseId,
20    ?if_source_since: IfSourceModifiedSinceCondition,
21    ?if_source_match: IfSourceMatchCondition,
22    ?source_lease_id: SourceLeaseId,
23    ?rehydrate_priority: RehydratePriority
24}
25
26impl CopyBlobBuilder {
27    pub fn into_future(mut self) -> CopyBlob {
28        Box::pin(async move {
29            let url = self.client.url()?;
30
31            let mut headers = Headers::new();
32            headers.insert(COPY_SOURCE, self.source_url.as_str().to_owned());
33            if let Some(metadata) = &self.metadata {
34                for m in metadata.iter() {
35                    headers.add(m);
36                }
37            }
38            headers.add(self.if_sequence_number);
39            headers.add(self.if_modified_since);
40            headers.add(self.if_match);
41            headers.add(self.access_tier);
42            headers.add(self.lease_id);
43            headers.add(self.if_source_since);
44            headers.add(self.if_source_match);
45            headers.add(self.source_lease_id);
46            headers.add(
47                self.rehydrate_priority
48                    .unwrap_or(RehydratePriority::Standard),
49            );
50
51            let mut request =
52                BlobClient::finalize_request(url, azure_core::Method::Put, headers, None)?;
53
54            let response = self.client.send(&mut self.context, &mut request).await?;
55
56            (response.headers()).try_into()
57        })
58    }
59}
60
61#[derive(Debug, Clone, PartialEq, Eq)]
62pub struct CopyBlobResponse {
63    pub etag: String,
64    pub last_modified: OffsetDateTime,
65    pub request_id: RequestId,
66    pub version: String,
67    pub server: String,
68    pub date: OffsetDateTime,
69    pub copy_id: CopyId,
70    pub copy_status: CopyStatus,
71}
72
73impl TryFrom<&Headers> for CopyBlobResponse {
74    type Error = azure_core::Error;
75
76    fn try_from(headers: &Headers) -> azure_core::Result<Self> {
77        Ok(Self {
78            etag: etag_from_headers(headers)?,
79            last_modified: last_modified_from_headers(headers)?,
80            request_id: request_id_from_headers(headers)?,
81            version: version_from_headers(headers)?,
82            server: server_from_headers(headers)?,
83            date: date_from_headers(headers)?,
84            copy_id: copy_id_from_headers(headers)?,
85            copy_status: copy_status_from_headers(headers)?,
86        })
87    }
88}