azure_storage_blobs/blob/operations/
put_block_blob.rs

1use crate::prelude::*;
2use azure_core::{headers::*, prelude::*, Body, RequestId};
3use azure_storage::{headers::consistency_from_headers, ConsistencyCRC64, ConsistencyMD5};
4use time::OffsetDateTime;
5
6operation! {
7    PutBlockBlob,
8    client: BlobClient,
9    body: Body,
10    ?hash: Hash,
11    ?content_type: BlobContentType,
12    ?content_encoding: BlobContentEncoding,
13    ?content_language: BlobContentLanguage,
14    ?content_disposition: BlobContentDisposition,
15    ?metadata: Metadata,
16    ?access_tier: AccessTier,
17    ?tags: Tags,
18    ?lease_id: LeaseId,
19    ?encryption_key: CPKInfo,
20    ?encryption_scope: EncryptionScope,
21    ?if_modified_since: IfModifiedSinceCondition,
22    ?if_match: IfMatchCondition,
23    ?if_tags: IfTags
24}
25
26impl PutBlockBlobBuilder {
27    pub fn into_future(mut self) -> PutBlockBlob {
28        Box::pin(async move {
29            let url = self.client.url()?;
30
31            let mut headers = Headers::new();
32            headers.insert(BLOB_TYPE, "BlockBlob");
33            headers.add(self.hash);
34            headers.add(self.content_type);
35            headers.add(self.content_encoding);
36            headers.add(self.content_language);
37            headers.add(self.content_disposition);
38            headers.add(self.tags);
39            if let Some(metadata) = &self.metadata {
40                for m in metadata.iter() {
41                    headers.add(m);
42                }
43            }
44            headers.add(self.access_tier);
45            headers.add(self.lease_id);
46            headers.add(self.encryption_key);
47            headers.add(self.encryption_scope);
48            headers.add(self.if_modified_since);
49            headers.add(self.if_match);
50            headers.add(self.if_tags);
51
52            let mut request = BlobClient::finalize_request(
53                url,
54                azure_core::Method::Put,
55                headers,
56                Some(self.body),
57            )?;
58
59            let response = self.client.send(&mut self.context, &mut request).await?;
60            PutBlockBlobResponse::from_headers(response.headers())
61        })
62    }
63}
64
65#[derive(Debug, Clone)]
66pub struct PutBlockBlobResponse {
67    pub etag: String,
68    pub last_modified: OffsetDateTime,
69    pub content_md5: Option<ConsistencyMD5>,
70    pub content_crc64: Option<ConsistencyCRC64>,
71    pub request_id: RequestId,
72    pub date: OffsetDateTime,
73    pub request_server_encrypted: bool,
74}
75
76impl PutBlockBlobResponse {
77    pub fn from_headers(headers: &Headers) -> azure_core::Result<PutBlockBlobResponse> {
78        let etag = etag_from_headers(headers)?;
79        let last_modified = last_modified_from_headers(headers)?;
80        let (content_md5, content_crc64) = consistency_from_headers(headers)?;
81        let request_id = request_id_from_headers(headers)?;
82        let date = date_from_headers(headers)?;
83        let request_server_encrypted = request_server_encrypted_from_headers(headers)?;
84
85        Ok(PutBlockBlobResponse {
86            etag,
87            last_modified,
88            content_md5,
89            content_crc64,
90            request_id,
91            date,
92            request_server_encrypted,
93        })
94    }
95}