From f2a10e4b67e293ff85fb04aedec411f169b2e8f7 Mon Sep 17 00:00:00 2001 From: Rick Rainey Date: Fri, 10 Jun 2022 08:41:36 -0500 Subject: [PATCH 1/4] Migrate sdk/storage_blob to azure_core::error scheme --- sdk/storage_blobs/Cargo.toml | 1 - sdk/storage_blobs/src/ba512_range.rs | 56 +++++++++++++++------------- sdk/storage_blobs/src/errors.rs | 19 ---------- sdk/storage_blobs/src/lib.rs | 2 - 4 files changed, 31 insertions(+), 47 deletions(-) delete mode 100644 sdk/storage_blobs/src/errors.rs diff --git a/sdk/storage_blobs/Cargo.toml b/sdk/storage_blobs/Cargo.toml index 724ff14a37..8d75db1ef5 100644 --- a/sdk/storage_blobs/Cargo.toml +++ b/sdk/storage_blobs/Cargo.toml @@ -29,7 +29,6 @@ serde_json = "1.0" serde-xml-rs = "0.5" uuid = { version = "1.0", features = ["v4"] } url = "2.2" -thiserror = "1.0" [dev-dependencies] tokio = { version = "1.0", features = ["full"] } diff --git a/sdk/storage_blobs/src/ba512_range.rs b/sdk/storage_blobs/src/ba512_range.rs index 08208dc950..4cca9ea074 100644 --- a/sdk/storage_blobs/src/ba512_range.rs +++ b/sdk/storage_blobs/src/ba512_range.rs @@ -1,4 +1,4 @@ -use crate::{Not512ByteAlignedError, Parse512AlignedError}; +use azure_core::error::{Error, ErrorKind, Result, ResultExt}; use azure_core::headers::{self, Header}; use azure_core::prelude::Range; use std::convert::TryFrom; @@ -19,12 +19,16 @@ impl BA512Range { self.end } - pub fn new(start: u64, end: u64) -> Result { + pub fn new(start: u64, end: u64) -> Result { if start % 512 != 0 { - return Err(Not512ByteAlignedError::StartRange(start)); + return Err(Error::with_message(ErrorKind::Other, || { + format!("start range not 512-byte aligned: {}", start) + })); } if (end + 1) % 512 != 0 { - return Err(Not512ByteAlignedError::EndRange(end)); + return Err(Error::with_message(ErrorKind::Other, || { + format!("end range not 512-byte aligned: {}", end) + })); } Ok(Self { start, end }) @@ -46,17 +50,17 @@ impl From for Range { } impl TryFrom for BA512Range { - type Error = Not512ByteAlignedError; + type Error = Error; - fn try_from(r: Range) -> Result { + fn try_from(r: Range) -> Result { BA512Range::new(r.start, r.end) } } impl TryFrom<(u64, u64)> for BA512Range { - type Error = Not512ByteAlignedError; + type Error = Error; - fn try_from((start, end): (u64, u64)) -> Result { + fn try_from((start, end): (u64, u64)) -> Result { BA512Range::new(start, end) } } @@ -72,17 +76,25 @@ impl Header for BA512Range { } impl FromStr for BA512Range { - type Err = Parse512AlignedError; - fn from_str(s: &str) -> Result { + type Err = Error; + fn from_str(s: &str) -> Result { let v = s.split('/').collect::>(); if v.len() != 2 { - return Err(Parse512AlignedError::SplitNotFound); + return Err(Error::message(ErrorKind::Other, "split not found")); } - let cp_start = v[0].parse::()?; - let cp_end = v[1].parse::()?; + let cp_start = v[0] + .parse::() + .with_context(ErrorKind::DataConversion, || { + format!("error parsing '{}' into u64", v[0]) + })?; + let cp_end = v[1] + .parse::() + .with_context(ErrorKind::DataConversion, || { + format!("error parsing '{}' into u64", v[1]) + })?; - Ok(BA512Range::new(cp_start, cp_end)?) + BA512Range::new(cp_start, cp_end) } } @@ -104,7 +116,7 @@ impl<'a> From<&'a BA512Range> for Range { #[cfg(test)] mod test { use super::*; - use crate::Not512ByteAlignedError::{EndRange, StartRange}; + use azure_core::error::ErrorKind; #[test] fn test_512range_parse() { @@ -117,31 +129,25 @@ mod test { #[test] fn test_512range_parse_panic_1() { let err = "abba/2000".parse::().unwrap_err(); - assert!(matches!(err, Parse512AlignedError::ParseIntError(_))); + assert!(matches!(err.kind(), ErrorKind::DataConversion)); } #[test] fn test_512range_parse_panic_2() { let err = "1000-2000".parse::().unwrap_err(); - assert_eq!(err, Parse512AlignedError::SplitNotFound); + assert!(matches!(err.kind(), ErrorKind::Other)); } #[test] fn test_512range_invalid_start_range() { let err = "7/511".parse::().unwrap_err(); - assert_eq!( - err, - Parse512AlignedError::Not512ByteAlignedError(StartRange(7)) - ); + assert!(matches!(err.kind(), ErrorKind::Other)); } #[test] fn test_512range_invalid_end_range() { let err = "0/100".parse::().unwrap_err(); - assert_eq!( - err, - Parse512AlignedError::Not512ByteAlignedError(EndRange(100)) - ); + assert!(matches!(err.kind(), ErrorKind::Other)); } #[test] diff --git a/sdk/storage_blobs/src/errors.rs b/sdk/storage_blobs/src/errors.rs deleted file mode 100644 index 7b9d2ad962..0000000000 --- a/sdk/storage_blobs/src/errors.rs +++ /dev/null @@ -1,19 +0,0 @@ -/// An error caused by a range not being 512-byte aligned. -#[derive(Debug, PartialEq, thiserror::Error)] -pub enum Not512ByteAlignedError { - #[error("start range not 512-byte aligned: {0}")] - StartRange(u64), - #[error("end range not 512-byte aligned: {0}")] - EndRange(u64), -} - -/// An error caused by a range not being 512-byte aligned or by a parse failure. -#[derive(Debug, PartialEq, thiserror::Error)] -pub enum Parse512AlignedError { - #[error("split not found")] - SplitNotFound, - #[error("parse int error: {0}")] - ParseIntError(#[from] std::num::ParseIntError), - #[error("not 512 byte aligned error: {0}")] - Not512ByteAlignedError(#[from] Not512ByteAlignedError), -} diff --git a/sdk/storage_blobs/src/lib.rs b/sdk/storage_blobs/src/lib.rs index dacd51942f..25c6eeabb0 100644 --- a/sdk/storage_blobs/src/lib.rs +++ b/sdk/storage_blobs/src/lib.rs @@ -18,7 +18,6 @@ mod condition_append_position; mod condition_max_size; pub mod container; mod delete_snapshot_method; -mod errors; mod hash; mod headers; mod incomplete_vector; @@ -34,7 +33,6 @@ pub use block_id::BlockId; pub use condition_append_position::ConditionAppendPosition; pub use condition_max_size::ConditionMaxSize; pub use delete_snapshot_method::DeleteSnapshotsMethod; -pub use errors::*; pub use hash::Hash; pub use snapshot::Snapshot; pub use version_id::VersionId; From 2519d271f7f01ab7a4c99660840b6cdfd72e3381 Mon Sep 17 00:00:00 2001 From: Rick Rainey Date: Mon, 13 Jun 2022 15:18:22 -0500 Subject: [PATCH 2/4] Modify code to use azure_core::error --- .../src/blob/block_with_size_list.rs | 13 +- sdk/storage_blobs/src/blob/mod.rs | 77 ++++++---- sdk/storage_blobs/src/blob/page_range_list.rs | 4 +- .../responses/copy_blob_from_url_response.rs | 8 +- .../src/blob/responses/copy_blob_response.rs | 5 +- .../src/blob/responses/get_blob_response.rs | 8 +- .../src/blob/responses/list_blobs_response.rs | 6 +- .../blob/responses/put_block_blob_response.rs | 4 +- .../blob/responses/put_block_list_response.rs | 3 +- .../src/blob/responses/put_block_response.rs | 4 +- .../blob/responses/update_page_response.rs | 3 +- sdk/storage_blobs/src/container/mod.rs | 134 ++++++++++++------ .../container/responses/get_acl_response.rs | 29 ++-- .../responses/get_properties_response.rs | 17 ++- sdk/storage_blobs/src/lib.rs | 2 +- 15 files changed, 208 insertions(+), 109 deletions(-) diff --git a/sdk/storage_blobs/src/blob/block_with_size_list.rs b/sdk/storage_blobs/src/blob/block_with_size_list.rs index e296380890..c1937df723 100644 --- a/sdk/storage_blobs/src/blob/block_with_size_list.rs +++ b/sdk/storage_blobs/src/blob/block_with_size_list.rs @@ -1,5 +1,7 @@ use crate::blob::BlobBlockType; use crate::blob::BlobBlockWithSize; +use azure_core::error::{ErrorKind, ResultExt}; + #[derive(Debug, Deserialize)] struct Name { #[serde(rename = "$value")] @@ -41,7 +43,8 @@ pub struct BlockWithSizeList { impl BlockWithSizeList { pub fn try_from_xml(xml: &str) -> crate::Result { - let bl: BlockList = serde_xml_rs::de::from_reader(xml.as_bytes())?; + let bl: BlockList = + serde_xml_rs::de::from_reader(xml.as_bytes()).map_kind(ErrorKind::DataConversion)?; debug!("bl == {:?}", bl); let mut lbs = BlockWithSizeList { blocks: Vec::new() }; @@ -50,7 +53,9 @@ impl BlockWithSizeList { for b_val in b { lbs.blocks.push(BlobBlockWithSize { block_list_type: BlobBlockType::Committed( - base64::decode(&b_val.name.value)?.into(), + base64::decode(&b_val.name.value) + .map_kind(ErrorKind::DataConversion)? + .into(), ), size_in_bytes: b_val.size.value, }); @@ -61,7 +66,9 @@ impl BlockWithSizeList { for b_val in b { lbs.blocks.push(BlobBlockWithSize { block_list_type: BlobBlockType::Uncommitted( - base64::decode(&b_val.name.value)?.into(), + base64::decode(&b_val.name.value) + .map_kind(ErrorKind::DataConversion)? + .into(), ), size_in_bytes: b_val.size.value, }); diff --git a/sdk/storage_blobs/src/blob/mod.rs b/sdk/storage_blobs/src/blob/mod.rs index 1afaad77d7..89549791b5 100644 --- a/sdk/storage_blobs/src/blob/mod.rs +++ b/sdk/storage_blobs/src/blob/mod.rs @@ -15,6 +15,7 @@ pub use self::page_range_list::PageRangeList; pub mod requests; pub mod responses; use crate::AccessTier; +use azure_core::error::{Error, ErrorKind, Result, ResultExt}; use azure_core::headers::{ BLOB_ACCESS_TIER, BLOB_SEQUENCE_NUMBER, BLOB_TYPE, COPY_COMPLETION_TIME, COPY_PROGRESS, COPY_SOURCE, COPY_STATUS, COPY_STATUS_DESCRIPTION, CREATION_TIME, LEASE_DURATION, LEASE_STATE, @@ -67,7 +68,7 @@ create_enum!(RehydratePriority, (High, "High"), (Standard, "Standard")); create_enum!(PageWriteType, (Update, "update"), (Clear, "clear")); use serde::{self, Deserialize, Deserializer}; -fn deserialize_crc64_optional<'de, D>(deserializer: D) -> Result, D::Error> +fn deserialize_crc64_optional<'de, D>(deserializer: D) -> Result> where D: Deserializer<'de>, { @@ -79,7 +80,7 @@ where .map_err(serde::de::Error::custom) } -fn deserialize_md5_optional<'de, D>(deserializer: D) -> Result, D::Error> +fn deserialize_md5_optional<'de, D>(deserializer: D) -> Result> where D: Deserializer<'de>, { @@ -205,9 +206,11 @@ impl Blob { let creation_time = { let creation_time = h .get(CREATION_TIME) - .ok_or_else(|| crate::Error::HeaderNotFound(CREATION_TIME.to_owned()))? - .to_str()?; - let creation_time = DateTime::parse_from_rfc2822(creation_time)?; + .ok_or_else(|| Error::message(ErrorKind::DataConversion, CREATION_TIME))? + .to_str() + .map_kind(ErrorKind::DataConversion)?; + let creation_time = + DateTime::parse_from_rfc2822(creation_time).map_kind(ErrorKind::DataConversion)?; let creation_time = DateTime::from_utc(creation_time.naive_utc(), Utc); trace!("creation_time == {:?}", creation_time); creation_time @@ -224,22 +227,24 @@ impl Blob { .get(header::CONTENT_LENGTH) .ok_or_else(|| { static CL: header::HeaderName = header::CONTENT_LENGTH; - crate::Error::HeaderNotFound(CL.as_str().to_owned()) + Error::message(ErrorKind::DataConversion, CL.as_str()) })? - .to_str()? - .parse::()?; + .to_str() + .map_kind(ErrorKind::DataConversion)? + .parse::() + .map_kind(ErrorKind::DataConversion)?; trace!("content_length == {:?}", content_length); let last_modified = h.get_as_str(header::LAST_MODIFIED).ok_or_else(|| { static LM: header::HeaderName = header::LAST_MODIFIED; - crate::Error::HeaderNotFound(LM.as_str().to_owned()) + Error::message(ErrorKind::DataConversion, LM.as_str()) })?; - let last_modified = from_azure_time(last_modified)?; + let last_modified = from_azure_time(last_modified).map_kind(ErrorKind::DataConversion)?; trace!("last_modified == {:?}", last_modified); let etag = h.get_as_string(header::ETAG).ok_or_else(|| { static E: header::HeaderName = header::ETAG; - crate::Error::HeaderNotFound(E.as_str().to_owned()) + Error::message(ErrorKind::DataConversion, E.as_str()) })?; let etag = etag.into(); trace!("etag == {:?}", etag); @@ -249,17 +254,21 @@ impl Blob { let blob_type = h .get_as_str(BLOB_TYPE) - .ok_or_else(|| crate::Error::HeaderNotFound(BLOB_TYPE.to_owned()))? - .parse::()?; + .ok_or_else(|| Error::message(ErrorKind::DataConversion, BLOB_TYPE))? + .parse::() + .map_kind(ErrorKind::DataConversion)?; trace!("blob_type == {:?}", blob_type); let blob_type = h .get_as_str(BLOB_TYPE) - .ok_or_else(|| crate::Error::HeaderNotFound(BLOB_TYPE.to_owned()))? - .parse::()?; + .ok_or_else(|| Error::message(ErrorKind::DataConversion, BLOB_TYPE))? + .parse::() + .map_kind(ErrorKind::DataConversion)?; trace!("blob_type == {:?}", blob_type); - let access_tier = h.get_as_enum(BLOB_ACCESS_TIER)?; + let access_tier = h + .get_as_enum(BLOB_ACCESS_TIER) + .map_kind(ErrorKind::DataConversion)?; trace!("blob_access_tier == {:?}", access_tier); let content_encoding = h.get_as_string(header::CONTENT_ENCODING); @@ -271,13 +280,15 @@ impl Blob { let content_md5 = h .get_header(CONTENT_MD5) .map(|header| ConsistencyMD5::decode(header.as_bytes())) - .transpose()?; + .transpose() + .map_kind(ErrorKind::DataConversion)?; trace!("content_md5 == {:?}", content_md5); let content_crc64 = h .get_header(CONTENT_CRC64) .map(|header| ConsistencyCRC64::decode(header.as_bytes())) - .transpose()?; + .transpose() + .map_kind(ErrorKind::DataConversion)?; trace!("content_crc64 == {:?}", content_crc64); let cache_control = h.get_as_string(header::CACHE_CONTROL); @@ -285,25 +296,32 @@ impl Blob { let content_disposition = h.get_as_string(header::CONTENT_DISPOSITION); let lease_status = h - .get_as_enum(LEASE_STATUS)? - .ok_or_else(|| crate::Error::HeaderNotFound(LEASE_STATUS.to_owned()))?; + .get_as_enum(LEASE_STATUS) + .map_kind(ErrorKind::DataConversion)? + .ok_or_else(|| Error::message(ErrorKind::DataConversion, LEASE_STATUS))?; trace!("lease_status == {:?}", lease_status); let lease_state = h - .get_as_enum(LEASE_STATE)? - .ok_or_else(|| crate::Error::HeaderNotFound(LEASE_STATE.to_owned()))?; + .get_as_enum(LEASE_STATE) + .map_kind(ErrorKind::DataConversion)? + .ok_or_else(|| Error::message(ErrorKind::DataConversion, LEASE_STATE))?; trace!("lease_state == {:?}", lease_state); - let lease_duration = h.get_as_enum(LEASE_DURATION)?; + let lease_duration = h + .get_as_enum(LEASE_DURATION) + .map_kind(ErrorKind::DataConversion)?; trace!("lease_duration == {:?}", lease_duration); let copy_id = h .get_as_string(COPY_ID) .map(|c| (&c as &str).try_into()) - .transpose()?; + .transpose() + .map_kind(ErrorKind::DataConversion)?; trace!("copy_id == {:?}", copy_id); - let copy_status = h.get_as_enum(COPY_STATUS)?; + let copy_status = h + .get_as_enum(COPY_STATUS) + .map_kind(ErrorKind::DataConversion)?; trace!("copy_status == {:?}", copy_status); let copy_source = h.get_as_string(COPY_SOURCE); @@ -328,8 +346,9 @@ impl Blob { let server_encrypted = h .get_as_str(SERVER_ENCRYPTED) - .ok_or_else(|| crate::Error::HeaderNotFound(SERVER_ENCRYPTED.to_owned()))? - .parse::()?; + .ok_or_else(|| Error::message(ErrorKind::DataConversion, SERVER_ENCRYPTED))? + .parse::() + .map_kind(ErrorKind::DataConversion)?; let mut metadata = HashMap::new(); for (name, value) in h.iter() { @@ -402,6 +421,6 @@ impl Blob { pub(crate) fn copy_status_from_headers(headers: &http::HeaderMap) -> crate::Result { let val = headers .get_as_str(azure_core::headers::COPY_STATUS) - .ok_or_else(|| crate::Error::HeaderNotFound(azure_core::headers::COPY_STATUS.to_owned()))?; - Ok(CopyStatus::from_str(val)?) + .ok_or_else(|| Error::message(ErrorKind::DataConversion, COPY_STATUS))?; + Ok(CopyStatus::from_str(val).map_kind(ErrorKind::DataConversion)?) } diff --git a/sdk/storage_blobs/src/blob/page_range_list.rs b/sdk/storage_blobs/src/blob/page_range_list.rs index b254377f23..310fece9cc 100644 --- a/sdk/storage_blobs/src/blob/page_range_list.rs +++ b/sdk/storage_blobs/src/blob/page_range_list.rs @@ -1,3 +1,4 @@ +use azure_core::error::{ErrorKind, ResultExt}; use azure_core::prelude::Range; #[derive(Debug, Deserialize)] @@ -33,7 +34,8 @@ pub struct PageRangeList { impl PageRangeList { pub fn try_from_xml(xml: &str) -> crate::Result { - let pl: PageList = serde_xml_rs::de::from_reader(xml.as_bytes())?; + let pl: PageList = + serde_xml_rs::de::from_reader(xml.as_bytes()).map_kind(ErrorKind::DataConversion)?; debug!("pl == {:?}", pl); let mut prl = PageRangeList { ranges: Vec::new() }; diff --git a/sdk/storage_blobs/src/blob/responses/copy_blob_from_url_response.rs b/sdk/storage_blobs/src/blob/responses/copy_blob_from_url_response.rs index 7de14fa037..5ea842e9fa 100644 --- a/sdk/storage_blobs/src/blob/responses/copy_blob_from_url_response.rs +++ b/sdk/storage_blobs/src/blob/responses/copy_blob_from_url_response.rs @@ -1,4 +1,5 @@ use crate::blob::{copy_status_from_headers, CopyStatus}; +use azure_core::error::{ErrorKind, Result, ResultExt}; use azure_core::headers::{ date_from_headers, etag_from_headers, last_modified_from_headers, request_id_from_headers, server_from_headers, version_from_headers, @@ -26,16 +27,17 @@ pub struct CopyBlobFromUrlResponse { impl TryFrom<&HeaderMap> for CopyBlobFromUrlResponse { type Error = crate::Error; - fn try_from(headers: &HeaderMap) -> Result { + fn try_from(headers: &HeaderMap) -> Result { debug!("headers == {:#?}", headers); Ok(Self { - content_md5: content_md5_from_headers_optional(headers)?, + content_md5: content_md5_from_headers_optional(headers) + .map_kind(ErrorKind::DataConversion)?, last_modified: last_modified_from_headers(headers)?, etag: etag_from_headers(headers)?, server: server_from_headers(headers)?.to_owned(), request_id: request_id_from_headers(headers)?, version: version_from_headers(headers)?.to_owned(), - copy_id: copy_id_from_headers(headers)?, + copy_id: copy_id_from_headers(headers).map_kind(ErrorKind::DataConversion)?, copy_status: copy_status_from_headers(headers)?, date: date_from_headers(headers)?, }) diff --git a/sdk/storage_blobs/src/blob/responses/copy_blob_response.rs b/sdk/storage_blobs/src/blob/responses/copy_blob_response.rs index 268c205581..ea19a2de07 100644 --- a/sdk/storage_blobs/src/blob/responses/copy_blob_response.rs +++ b/sdk/storage_blobs/src/blob/responses/copy_blob_response.rs @@ -1,4 +1,5 @@ use crate::blob::{copy_status_from_headers, CopyStatus}; +use azure_core::error::{ErrorKind, Result, ResultExt}; use azure_core::headers::{ client_request_id_from_headers_optional, date_from_headers, etag_from_headers, last_modified_from_headers, request_id_from_headers, server_from_headers, version_from_headers, @@ -25,7 +26,7 @@ pub struct CopyBlobResponse { impl TryFrom<&HeaderMap> for CopyBlobResponse { type Error = crate::Error; - fn try_from(headers: &HeaderMap) -> Result { + fn try_from(headers: &HeaderMap) -> Result { trace!("CopyBlobResponse headers == {:#?}", headers); Ok(Self { etag: etag_from_headers(headers)?, @@ -34,7 +35,7 @@ impl TryFrom<&HeaderMap> for CopyBlobResponse { version: version_from_headers(headers)?.to_owned(), server: server_from_headers(headers)?.to_owned(), date: date_from_headers(headers)?, - copy_id: copy_id_from_headers(headers)?, + copy_id: copy_id_from_headers(headers).map_kind(ErrorKind::DataConversion)?, copy_status: copy_status_from_headers(headers)?, client_request_id: client_request_id_from_headers_optional(headers), }) diff --git a/sdk/storage_blobs/src/blob/responses/get_blob_response.rs b/sdk/storage_blobs/src/blob/responses/get_blob_response.rs index d1e74a5e70..587d0135a4 100644 --- a/sdk/storage_blobs/src/blob/responses/get_blob_response.rs +++ b/sdk/storage_blobs/src/blob/responses/get_blob_response.rs @@ -1,4 +1,5 @@ use crate::blob::Blob; +use azure_core::error::{ErrorKind, Result, ResultExt}; use azure_core::headers::{date_from_headers, request_id_from_headers}; use azure_core::prelude::ContentRange; use azure_core::RequestId; @@ -19,7 +20,7 @@ pub struct GetBlobResponse { impl TryFrom<(&str, Response)> for GetBlobResponse { type Error = crate::Error; - fn try_from((blob_name, response): (&str, Response)) -> Result { + fn try_from((blob_name, response): (&str, Response)) -> Result { debug!("response.headers() == {:#?}", response.headers()); let request_id = request_id_from_headers(response.headers())?; @@ -27,7 +28,10 @@ impl TryFrom<(&str, Response)> for GetBlobResponse { let content_range_header = response.headers().get(http::header::CONTENT_RANGE); let content_range = match content_range_header { - Some(hv) => Some(ContentRange::from_str(hv.to_str()?)?), + Some(hv) => Some( + ContentRange::from_str(hv.to_str().map_kind(ErrorKind::DataConversion)?) + .map_kind(ErrorKind::DataConversion)?, + ), None => None, }; diff --git a/sdk/storage_blobs/src/blob/responses/list_blobs_response.rs b/sdk/storage_blobs/src/blob/responses/list_blobs_response.rs index 541e359c9e..3890431836 100644 --- a/sdk/storage_blobs/src/blob/responses/list_blobs_response.rs +++ b/sdk/storage_blobs/src/blob/responses/list_blobs_response.rs @@ -1,4 +1,5 @@ use crate::blob::Blob; +use azure_core::error::{ErrorKind, Result, ResultExt}; use azure_core::headers::{date_from_headers, request_id_from_headers}; use azure_core::prelude::NextMarker; use azure_core::RequestId; @@ -45,11 +46,12 @@ pub struct BlobPrefix { impl TryFrom<&http::Response> for ListBlobsResponse { type Error = crate::Error; - fn try_from(response: &http::Response) -> Result { + fn try_from(response: &http::Response) -> Result { let body = response.body(); trace!("body == {:?}", body); - let list_blobs_response_internal: ListBlobsResponseInternal = read_xml(body)?; + let list_blobs_response_internal: ListBlobsResponseInternal = + read_xml(body).map_kind(ErrorKind::DataConversion)?; Ok(Self { request_id: request_id_from_headers(response.headers())?, diff --git a/sdk/storage_blobs/src/blob/responses/put_block_blob_response.rs b/sdk/storage_blobs/src/blob/responses/put_block_blob_response.rs index 2bc4072091..3465b58d12 100644 --- a/sdk/storage_blobs/src/blob/responses/put_block_blob_response.rs +++ b/sdk/storage_blobs/src/blob/responses/put_block_blob_response.rs @@ -1,3 +1,4 @@ +use azure_core::error::{ErrorKind, ResultExt}; use azure_core::headers::{ date_from_headers, etag_from_headers, last_modified_from_headers, request_id_from_headers, request_server_encrypted_from_headers, @@ -24,7 +25,8 @@ impl PutBlockBlobResponse { let etag = etag_from_headers(headers)?; let last_modified = last_modified_from_headers(headers)?; - let (content_md5, content_crc64) = consistency_from_headers(headers)?; + let (content_md5, content_crc64) = + consistency_from_headers(headers).map_kind(ErrorKind::DataConversion)?; let request_id = request_id_from_headers(headers)?; let date = date_from_headers(headers)?; let request_server_encrypted = request_server_encrypted_from_headers(headers)?; diff --git a/sdk/storage_blobs/src/blob/responses/put_block_list_response.rs b/sdk/storage_blobs/src/blob/responses/put_block_list_response.rs index 25bac9369a..386d705ae4 100644 --- a/sdk/storage_blobs/src/blob/responses/put_block_list_response.rs +++ b/sdk/storage_blobs/src/blob/responses/put_block_list_response.rs @@ -1,3 +1,4 @@ +use azure_core::error::{ErrorKind, ResultExt}; use azure_core::headers::{ date_from_headers, etag_from_headers, last_modified_from_headers, request_id_from_headers, request_server_encrypted_from_headers, @@ -24,7 +25,7 @@ impl PutBlockListResponse { let etag = etag_from_headers(headers)?; let last_modified = last_modified_from_headers(headers)?; - let content_md5 = content_md5_from_headers(headers)?; + let content_md5 = content_md5_from_headers(headers).map_kind(ErrorKind::DataConversion)?; let request_id = request_id_from_headers(headers)?; let date = date_from_headers(headers)?; let request_server_encrypted = request_server_encrypted_from_headers(headers)?; diff --git a/sdk/storage_blobs/src/blob/responses/put_block_response.rs b/sdk/storage_blobs/src/blob/responses/put_block_response.rs index ba71376544..2859edc9e5 100644 --- a/sdk/storage_blobs/src/blob/responses/put_block_response.rs +++ b/sdk/storage_blobs/src/blob/responses/put_block_response.rs @@ -1,3 +1,4 @@ +use azure_core::error::{ErrorKind, ResultExt}; use azure_core::headers::{ date_from_headers, request_id_from_headers, request_server_encrypted_from_headers, }; @@ -19,7 +20,8 @@ impl PutBlockResponse { pub(crate) fn from_headers(headers: &HeaderMap) -> crate::Result { debug!("{:#?}", headers); - let (content_md5, content_crc64) = consistency_from_headers(headers)?; + let (content_md5, content_crc64) = + consistency_from_headers(headers).map_kind(ErrorKind::DataConversion)?; let request_id = request_id_from_headers(headers)?; let date = date_from_headers(headers)?; let request_server_encrypted = request_server_encrypted_from_headers(headers)?; diff --git a/sdk/storage_blobs/src/blob/responses/update_page_response.rs b/sdk/storage_blobs/src/blob/responses/update_page_response.rs index c977377735..9ac52a4fbf 100644 --- a/sdk/storage_blobs/src/blob/responses/update_page_response.rs +++ b/sdk/storage_blobs/src/blob/responses/update_page_response.rs @@ -1,3 +1,4 @@ +use azure_core::error::{ErrorKind, ResultExt}; use azure_core::headers::{ date_from_headers, etag_from_headers, last_modified_from_headers, request_id_from_headers, request_server_encrypted_from_headers, sequence_number_from_headers, @@ -23,7 +24,7 @@ impl UpdatePageResponse { pub(crate) fn from_headers(headers: &HeaderMap) -> crate::Result { let etag = etag_from_headers(headers)?; let last_modified = last_modified_from_headers(headers)?; - let content_md5 = content_md5_from_headers(headers)?; + let content_md5 = content_md5_from_headers(headers).map_kind(ErrorKind::DataConversion)?; let sequence_number = sequence_number_from_headers(headers)?; let request_id = request_id_from_headers(headers)?; let date = date_from_headers(headers)?; diff --git a/sdk/storage_blobs/src/container/mod.rs b/sdk/storage_blobs/src/container/mod.rs index 99d7d6616f..db84aea122 100644 --- a/sdk/storage_blobs/src/container/mod.rs +++ b/sdk/storage_blobs/src/container/mod.rs @@ -1,3 +1,4 @@ +use azure_core::error::{Error, ErrorKind, ResultExt}; use azure_core::headers::{self, AsHeaders}; pub mod requests; pub mod responses; @@ -38,7 +39,8 @@ impl AsHeaders for PublicAccess { pub(crate) fn public_access_from_header(header_map: &HeaderMap) -> crate::Result { let pa = match header_map.get(BLOB_PUBLIC_ACCESS) { - Some(pa) => PublicAccess::from_str(pa.to_str()?)?, + Some(pa) => PublicAccess::from_str(pa.to_str().map_kind(ErrorKind::DataConversion)?) + .map_kind(ErrorKind::DataConversion)?, None => PublicAccess::None, }; Ok(pa) @@ -85,61 +87,91 @@ impl Container { NAME: Into, { let last_modified = match headers.get(header::LAST_MODIFIED) { - Some(last_modified) => last_modified.to_str()?, + Some(last_modified) => last_modified.to_str().map_kind(ErrorKind::DataConversion)?, None => { static LM: header::HeaderName = header::LAST_MODIFIED; - return Err(crate::Error::MissingHeaderError(LM.as_str().to_owned())); + return Err(Error::message(ErrorKind::DataConversion, LM.as_str())); } }; - let last_modified = DateTime::parse_from_rfc2822(last_modified)?; + let last_modified = + DateTime::parse_from_rfc2822(last_modified).map_kind(ErrorKind::DataConversion)?; let last_modified = DateTime::from_utc(last_modified.naive_utc(), Utc); let e_tag = match headers.get(header::ETAG) { - Some(e_tag) => e_tag.to_str()?.to_owned(), + Some(e_tag) => e_tag + .to_str() + .map_kind(ErrorKind::DataConversion)? + .to_owned(), None => { - return Err(crate::Error::MissingHeaderError( - header::ETAG.as_str().to_owned(), + return Err(Error::message( + ErrorKind::DataConversion, + header::ETAG.as_str(), )); } }; let lease_status = match headers.get(LEASE_STATUS) { - Some(lease_status) => lease_status.to_str()?, - None => return Err(crate::Error::MissingHeaderError(LEASE_STATUS.to_owned())), + Some(lease_status) => lease_status.to_str().map_kind(ErrorKind::DataConversion)?, + None => return Err(Error::message(ErrorKind::DataConversion, LEASE_STATUS)), }; - let lease_status = LeaseStatus::from_str(lease_status)?; + let lease_status = + LeaseStatus::from_str(lease_status).map_kind(ErrorKind::DataConversion)?; let lease_state = match headers.get(LEASE_STATE) { - Some(lease_state) => lease_state.to_str()?, - None => return Err(crate::Error::MissingHeaderError(LEASE_STATE.to_owned())), + Some(lease_state) => lease_state.to_str().map_kind(ErrorKind::DataConversion)?, + None => return Err(Error::message(ErrorKind::DataConversion, LEASE_STATE)), }; - let lease_state = LeaseState::from_str(lease_state)?; + let lease_state = LeaseState::from_str(lease_state).map_kind(ErrorKind::DataConversion)?; let lease_duration = match headers.get(LEASE_DURATION) { - Some(lease_duration) => Some(LeaseDuration::from_str(lease_duration.to_str()?)?), + Some(lease_duration) => Some( + LeaseDuration::from_str( + lease_duration + .to_str() + .map_kind(ErrorKind::DataConversion)?, + ) + .map_kind(ErrorKind::DataConversion)?, + ), None => None, }; let public_access = public_access_from_header(headers)?; let has_immutability_policy = match headers.get(HAS_IMMUTABILITY_POLICY) { - Some(has_immutability_policy) => bool::from_str(has_immutability_policy.to_str()?)?, + Some(has_immutability_policy) => bool::from_str( + has_immutability_policy + .to_str() + .map_kind(ErrorKind::DataConversion)?, + ) + .map_kind(ErrorKind::DataConversion)?, None => { - return Err(crate::Error::MissingHeaderError( - HAS_IMMUTABILITY_POLICY.to_owned(), + return Err(Error::message( + ErrorKind::DataConversion, + HAS_IMMUTABILITY_POLICY, )) } }; let has_legal_hold = match headers.get(HAS_LEGAL_HOLD) { - Some(has_legal_hold) => bool::from_str(has_legal_hold.to_str()?)?, - None => return Err(crate::Error::MissingHeaderError(HAS_LEGAL_HOLD.to_owned())), + Some(has_legal_hold) => bool::from_str( + has_legal_hold + .to_str() + .map_kind(ErrorKind::DataConversion)?, + ) + .map_kind(ErrorKind::DataConversion)?, + None => return Err(Error::message(ErrorKind::DataConversion, HAS_LEGAL_HOLD)), }; let mut metadata: HashMap = HashMap::new(); for (key, value) in headers { if key.as_str().starts_with(META_PREFIX) { - metadata.insert(key.as_str().to_owned(), value.to_str()?.to_owned()); + metadata.insert( + key.as_str().to_owned(), + value + .to_str() + .map_kind(ErrorKind::DataConversion)? + .to_owned(), + ); } } @@ -158,57 +190,68 @@ impl Container { } fn parse(elem: &Element) -> crate::Result { - let name = cast_must::(elem, &["Name"])?; - let last_modified = cast_must::>(elem, &["Properties", "Last-Modified"])?; - let e_tag = cast_must::(elem, &["Properties", "Etag"])?; + let name = cast_must::(elem, &["Name"]).map_kind(ErrorKind::DataConversion)?; + let last_modified = cast_must::>(elem, &["Properties", "Last-Modified"]) + .map_kind(ErrorKind::DataConversion)?; + let e_tag = cast_must::(elem, &["Properties", "Etag"]) + .map_kind(ErrorKind::DataConversion)?; - let lease_state = cast_must::(elem, &["Properties", "LeaseState"])?; + let lease_state = cast_must::(elem, &["Properties", "LeaseState"]) + .map_kind(ErrorKind::DataConversion)?; - let lease_duration = - cast_optional::(elem, &["Properties", "LeaseDuration"])?; + let lease_duration = cast_optional::(elem, &["Properties", "LeaseDuration"]) + .map_kind(ErrorKind::DataConversion)?; - let lease_status = cast_must::(elem, &["Properties", "LeaseStatus"])?; + let lease_status = cast_must::(elem, &["Properties", "LeaseStatus"]) + .map_kind(ErrorKind::DataConversion)?; let public_access = - match cast_optional::(elem, &["Properties", "PublicAccess"])? { + match cast_optional::(elem, &["Properties", "PublicAccess"]) + .map_kind(ErrorKind::DataConversion)? + { Some(pa) => pa, None => PublicAccess::None, }; let has_immutability_policy = - cast_must::(elem, &["Properties", "HasImmutabilityPolicy"])?; - let has_legal_hold = cast_must::(elem, &["Properties", "HasLegalHold"])?; + cast_must::(elem, &["Properties", "HasImmutabilityPolicy"]) + .map_kind(ErrorKind::DataConversion)?; + let has_legal_hold = cast_must::(elem, &["Properties", "HasLegalHold"]) + .map_kind(ErrorKind::DataConversion)?; let metadata = { let mut hm = HashMap::new(); - let metadata = traverse(elem, &["Metadata"], true)?; + let metadata = + traverse(elem, &["Metadata"], true).map_kind(ErrorKind::DataConversion)?; for m in metadata { for key in &m.children { let elem = match key { Xml::ElementNode(elem) => elem, _ => { - return Err(crate::Error::UnexpectedXMLError(String::from( + return Err(Error::message( + ErrorKind::DataConversion, "Metadata should contain an ElementNode", - ))); + )); } }; let key = elem.name.to_owned(); if elem.children.is_empty() { - return Err(crate::Error::UnexpectedXMLError(String::from( + return Err(Error::message( + ErrorKind::DataConversion, "Metadata node should not be empty", - ))); + )); } let content = { match elem.children[0] { Xml::CharacterNode(ref content) => content.to_owned(), _ => { - return Err(crate::Error::UnexpectedXMLError(String::from( + return Err(Error::message(ErrorKind::DataConversion, "Metadata node should contain a CharacterNode with metadata value", - ))); + )); } } }; @@ -238,19 +281,22 @@ impl Container { pub(crate) fn incomplete_vector_from_container_response( body: &str, ) -> crate::Result> { - let elem: Element = body.parse()?; + let elem: Element = body.parse().map_kind(ErrorKind::Other)?; let mut v = Vec::new(); - for container in traverse(&elem, &["Containers", "Container"], true)? { + for container in + traverse(&elem, &["Containers", "Container"], true).map_kind(ErrorKind::Other)? + { v.push(Container::parse(container)?); } - let next_marker = match cast_optional::(&elem, &["NextMarker"])? { - Some(ref nm) if nm.is_empty() => None, - Some(nm) => Some(nm.into()), - None => None, - }; + let next_marker = + match cast_optional::(&elem, &["NextMarker"]).map_kind(ErrorKind::Other)? { + Some(ref nm) if nm.is_empty() => None, + Some(nm) => Some(nm.into()), + None => None, + }; Ok(IncompleteVector::new(next_marker, v)) } diff --git a/sdk/storage_blobs/src/container/responses/get_acl_response.rs b/sdk/storage_blobs/src/container/responses/get_acl_response.rs index 8770ecd4bc..a929fe902c 100644 --- a/sdk/storage_blobs/src/container/responses/get_acl_response.rs +++ b/sdk/storage_blobs/src/container/responses/get_acl_response.rs @@ -1,4 +1,5 @@ use crate::container::{public_access_from_header, PublicAccess}; +use azure_core::error::{Error, ErrorKind, Result, ResultExt}; use azure_core::headers::REQUEST_ID; use azure_core::RequestId; use azure_storage::core::StoredAccessPolicyList; @@ -22,7 +23,7 @@ pub struct GetACLResponse { impl TryFrom<(&Bytes, &HeaderMap)> for GetACLResponse { type Error = crate::Error; - fn try_from((body, header_map): (&Bytes, &HeaderMap)) -> Result { + fn try_from((body, header_map): (&Bytes, &HeaderMap)) -> Result { GetACLResponse::from_response(body, header_map) } } @@ -36,43 +37,45 @@ impl GetACLResponse { let public_access = public_access_from_header(headers)?; let etag = match headers.get(header::ETAG) { - Some(etag) => etag.to_str()?, + Some(etag) => etag.to_str().map_kind(ErrorKind::DataConversion)?, None => { static E: header::HeaderName = header::ETAG; - return Err(crate::Error::MissingHeaderError(E.as_str().to_owned())); + return Err(Error::message(ErrorKind::DataConversion, E.as_str())); } }; let last_modified = match headers.get(header::LAST_MODIFIED) { - Some(last_modified) => last_modified.to_str()?, + Some(last_modified) => last_modified.to_str().map_kind(ErrorKind::DataConversion)?, None => { static LM: header::HeaderName = header::LAST_MODIFIED; - return Err(crate::Error::MissingHeaderError(LM.as_str().to_owned())); + return Err(Error::message(ErrorKind::DataConversion, LM.as_str())); } }; - let last_modified = DateTime::parse_from_rfc2822(last_modified)?; + let last_modified = + DateTime::parse_from_rfc2822(last_modified).map_kind(ErrorKind::DataConversion)?; let request_id = match headers.get(REQUEST_ID) { - Some(request_id) => request_id.to_str()?, - None => return Err(crate::Error::MissingHeaderError(REQUEST_ID.to_owned())), + Some(request_id) => request_id.to_str().map_kind(ErrorKind::DataConversion)?, + None => return Err(Error::message(ErrorKind::DataConversion, REQUEST_ID)), }; let date = match headers.get(header::DATE) { - Some(date) => date.to_str()?, + Some(date) => date.to_str().map_kind(ErrorKind::DataConversion)?, None => { static D: header::HeaderName = header::DATE; - return Err(crate::Error::MissingHeaderError(D.as_str().to_owned())); + return Err(Error::message(ErrorKind::DataConversion, D.as_str())); } }; - let date = DateTime::parse_from_rfc2822(date)?; + let date = DateTime::parse_from_rfc2822(date).map_kind(ErrorKind::DataConversion)?; - let stored_access_policy_list = StoredAccessPolicyList::from_xml(body)?; + let stored_access_policy_list = + StoredAccessPolicyList::from_xml(body).map_kind(ErrorKind::DataConversion)?; Ok(GetACLResponse { public_access, etag: etag.to_owned(), last_modified, - request_id: Uuid::parse_str(request_id)?, + request_id: Uuid::parse_str(request_id).map_kind(ErrorKind::DataConversion)?, date, stored_access_policy_list, }) diff --git a/sdk/storage_blobs/src/container/responses/get_properties_response.rs b/sdk/storage_blobs/src/container/responses/get_properties_response.rs index a0a6ccdb78..8d2108898d 100644 --- a/sdk/storage_blobs/src/container/responses/get_properties_response.rs +++ b/sdk/storage_blobs/src/container/responses/get_properties_response.rs @@ -1,4 +1,5 @@ use crate::container::Container; +use azure_core::error::{Error, ErrorKind, Result, ResultExt}; use azure_core::headers::REQUEST_ID; use azure_core::RequestId; use chrono::{DateTime, FixedOffset}; @@ -16,7 +17,7 @@ pub struct GetPropertiesResponse { impl TryFrom<(&str, &HeaderMap)> for GetPropertiesResponse { type Error = crate::Error; - fn try_from((body, header_map): (&str, &HeaderMap)) -> Result { + fn try_from((body, header_map): (&str, &HeaderMap)) -> Result { GetPropertiesResponse::from_response(body, header_map) } } @@ -27,15 +28,21 @@ impl GetPropertiesResponse { headers: &HeaderMap, ) -> crate::Result { let request_id = match headers.get(REQUEST_ID) { - Some(request_id) => Uuid::parse_str(request_id.to_str()?)?, - None => return Err(crate::Error::MissingHeaderError(REQUEST_ID.to_owned())), + Some(request_id) => { + Uuid::parse_str(request_id.to_str().map_kind(ErrorKind::DataConversion)?) + .map_kind(ErrorKind::DataConversion)? + } + None => return Err(Error::message(ErrorKind::DataConversion, REQUEST_ID)), }; let date = match headers.get(header::DATE) { - Some(date) => DateTime::parse_from_rfc2822(date.to_str()?)?, + Some(date) => { + DateTime::parse_from_rfc2822(date.to_str().map_kind(ErrorKind::DataConversion)?) + .map_kind(ErrorKind::DataConversion)? + } None => { static D: header::HeaderName = header::DATE; - return Err(crate::Error::MissingHeaderError(D.as_str().to_owned())); + return Err(Error::message(ErrorKind::DataConversion, D.as_str())); } }; diff --git a/sdk/storage_blobs/src/lib.rs b/sdk/storage_blobs/src/lib.rs index 25c6eeabb0..5efec7be68 100644 --- a/sdk/storage_blobs/src/lib.rs +++ b/sdk/storage_blobs/src/lib.rs @@ -5,7 +5,7 @@ extern crate serde_derive; #[macro_use] extern crate azure_core; -pub use azure_storage::{Error, Result}; +pub use azure_core::error::{Error, ErrorKind, Result, ResultExt}; mod access_tier; mod ba512_range; From e8c8d33a7d906232438449028bbbfb489f86b21c Mon Sep 17 00:00:00 2001 From: Rick Rainey Date: Mon, 13 Jun 2022 17:36:32 -0500 Subject: [PATCH 3/4] Modify code to use azure_core::error --- sdk/storage_blobs/src/blob/mod.rs | 6 +++--- .../requests/get_blob_properties_builder.rs | 5 ++--- sdk/storage_blobs/src/clients/blob_client.rs | 21 +++++++------------ .../src/clients/blob_lease_client.rs | 6 ++---- .../src/clients/container_client.rs | 7 ++++--- 5 files changed, 19 insertions(+), 26 deletions(-) diff --git a/sdk/storage_blobs/src/blob/mod.rs b/sdk/storage_blobs/src/blob/mod.rs index 89549791b5..568f461d9b 100644 --- a/sdk/storage_blobs/src/blob/mod.rs +++ b/sdk/storage_blobs/src/blob/mod.rs @@ -15,7 +15,7 @@ pub use self::page_range_list::PageRangeList; pub mod requests; pub mod responses; use crate::AccessTier; -use azure_core::error::{Error, ErrorKind, Result, ResultExt}; +use azure_core::error::{Error, ErrorKind, ResultExt}; use azure_core::headers::{ BLOB_ACCESS_TIER, BLOB_SEQUENCE_NUMBER, BLOB_TYPE, COPY_COMPLETION_TIME, COPY_PROGRESS, COPY_SOURCE, COPY_STATUS, COPY_STATUS_DESCRIPTION, CREATION_TIME, LEASE_DURATION, LEASE_STATE, @@ -68,7 +68,7 @@ create_enum!(RehydratePriority, (High, "High"), (Standard, "Standard")); create_enum!(PageWriteType, (Update, "update"), (Clear, "clear")); use serde::{self, Deserialize, Deserializer}; -fn deserialize_crc64_optional<'de, D>(deserializer: D) -> Result> +fn deserialize_crc64_optional<'de, D>(deserializer: D) -> Result, D::Error> where D: Deserializer<'de>, { @@ -80,7 +80,7 @@ where .map_err(serde::de::Error::custom) } -fn deserialize_md5_optional<'de, D>(deserializer: D) -> Result> +fn deserialize_md5_optional<'de, D>(deserializer: D) -> Result, D::Error> where D: Deserializer<'de>, { diff --git a/sdk/storage_blobs/src/blob/requests/get_blob_properties_builder.rs b/sdk/storage_blobs/src/blob/requests/get_blob_properties_builder.rs index 459da995d9..e7f2ece9ce 100644 --- a/sdk/storage_blobs/src/blob/requests/get_blob_properties_builder.rs +++ b/sdk/storage_blobs/src/blob/requests/get_blob_properties_builder.rs @@ -1,5 +1,6 @@ use crate::blob::responses::GetBlobPropertiesResponse; use crate::prelude::*; +use azure_core::error::Result; use azure_core::headers::{add_optional_header, add_optional_header_ref}; use azure_core::prelude::*; @@ -30,9 +31,7 @@ impl<'a> GetBlobPropertiesBuilder<'a> { client_request_id: ClientRequestId => Some(client_request_id), } - pub async fn execute( - &self, - ) -> Result> { + pub async fn execute(&self) -> Result { let mut url = self.blob_client.url_with_segments(None)?; self.timeout.append_to_url_query(&mut url); diff --git a/sdk/storage_blobs/src/clients/blob_client.rs b/sdk/storage_blobs/src/clients/blob_client.rs index b8e3829d05..d543210ffb 100644 --- a/sdk/storage_blobs/src/clients/blob_client.rs +++ b/sdk/storage_blobs/src/clients/blob_client.rs @@ -1,6 +1,7 @@ use crate::blob::requests::*; use crate::prelude::*; use crate::BA512Range; +use azure_core::error::{Error, ErrorKind, Result, ResultExt}; use azure_core::prelude::*; use azure_core::{HttpClient, HttpError}; use azure_storage::core::clients::StorageCredentials; @@ -63,16 +64,14 @@ impl BlobClient { self.container_client.as_ref() } - pub(crate) fn url_with_segments<'a, I>( - &'a self, - segments: I, - ) -> Result + pub(crate) fn url_with_segments<'a, I>(&'a self, segments: I) -> Result where I: IntoIterator, { let blob_name_with_segments = self.blob_name.split('/').into_iter().chain(segments); self.container_client .url_with_segments(blob_name_with_segments) + .map_kind(ErrorKind::DataConversion) } pub fn get(&self) -> GetBlobBuilder { @@ -176,7 +175,7 @@ impl BlobClient { pub fn shared_access_signature( &self, - ) -> Result, crate::Error> { + ) -> Result> { let canonicalized_resource = format!( "/blob/{}/{}/{}", self.container_client.storage_account_client().account(), @@ -189,17 +188,13 @@ impl BlobClient { BlobSharedAccessSignatureBuilder::new(key.to_string(), canonicalized_resource) .with_resources(BlobSignedResource::Blob), ), - _ => Err(crate::Error::OperationNotSupported( - "Shared access signature generation".to_owned(), - "SAS can be generated only from key and account clients".to_owned(), + _ => Err(Error::message(ErrorKind::Credential, + "Shared access signature generation - SAS can be generated only from key and account clients", )), } } - pub fn generate_signed_blob_url( - &self, - signature: &T, - ) -> Result> + pub fn generate_signed_blob_url(&self, signature: &T) -> Result where T: SasToken, { @@ -219,7 +214,7 @@ impl BlobClient { .prepare_request(url, method, http_header_adder, request_body) } - pub async fn exists(&self) -> Result> { + pub async fn exists(&self) -> Result { let result = self.get_properties().execute().await.map(|_| true); if let Err(err) = &result { diff --git a/sdk/storage_blobs/src/clients/blob_lease_client.rs b/sdk/storage_blobs/src/clients/blob_lease_client.rs index 7a956e57be..94e9b46594 100644 --- a/sdk/storage_blobs/src/clients/blob_lease_client.rs +++ b/sdk/storage_blobs/src/clients/blob_lease_client.rs @@ -1,5 +1,6 @@ use crate::blob::requests::*; use crate::prelude::*; +use azure_core::error::Result; use azure_core::prelude::*; use azure_core::HttpClient; use azure_storage::core::prelude::*; @@ -55,10 +56,7 @@ impl BlobLeaseClient { self.blob_client.as_ref() } - pub(crate) fn url_with_segments<'a, I>( - &'a self, - segments: I, - ) -> Result + pub(crate) fn url_with_segments<'a, I>(&'a self, segments: I) -> Result where I: IntoIterator, { diff --git a/sdk/storage_blobs/src/clients/container_client.rs b/sdk/storage_blobs/src/clients/container_client.rs index ca7a262212..4ca170e01e 100644 --- a/sdk/storage_blobs/src/clients/container_client.rs +++ b/sdk/storage_blobs/src/clients/container_client.rs @@ -1,5 +1,6 @@ use crate::container::requests::*; use crate::prelude::PublicAccess; +use azure_core::error::{Error, ErrorKind, ResultExt}; use azure_core::prelude::*; use azure_core::HttpClient; use azure_storage::core::clients::{ @@ -118,6 +119,7 @@ impl ContainerClient { ) -> crate::Result<(Request, url::Url)> { self.storage_client .prepare_request(url, method, http_header_adder, request_body) + .map_kind(ErrorKind::DataConversion) } pub fn shared_access_signature( @@ -134,9 +136,8 @@ impl ContainerClient { BlobSharedAccessSignatureBuilder::new(key.to_string(), canonicalized_resource) .with_resources(BlobSignedResource::Container), ), - _ => Err(crate::Error::OperationNotSupported( - "Shared access signature generation".to_owned(), - "SAS can be generated only from key and account clients".to_owned(), + _ => Err(Error::message(ErrorKind::Credential, + "Shared access signature generation - SAS can be generated only from key and account clients", )), } } From 8d57bae3eb69ca26345fdd4ee960b0e235e80c8f Mon Sep 17 00:00:00 2001 From: Rick Rainey Date: Mon, 13 Jun 2022 17:38:37 -0500 Subject: [PATCH 4/4] cargo clippy --- sdk/storage_blobs/src/blob/mod.rs | 2 +- .../src/blob/requests/get_blob_properties_builder.rs | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/sdk/storage_blobs/src/blob/mod.rs b/sdk/storage_blobs/src/blob/mod.rs index 568f461d9b..99eb0ff22c 100644 --- a/sdk/storage_blobs/src/blob/mod.rs +++ b/sdk/storage_blobs/src/blob/mod.rs @@ -422,5 +422,5 @@ pub(crate) fn copy_status_from_headers(headers: &http::HeaderMap) -> crate::Resu let val = headers .get_as_str(azure_core::headers::COPY_STATUS) .ok_or_else(|| Error::message(ErrorKind::DataConversion, COPY_STATUS))?; - Ok(CopyStatus::from_str(val).map_kind(ErrorKind::DataConversion)?) + CopyStatus::from_str(val).map_kind(ErrorKind::DataConversion) } diff --git a/sdk/storage_blobs/src/blob/requests/get_blob_properties_builder.rs b/sdk/storage_blobs/src/blob/requests/get_blob_properties_builder.rs index e7f2ece9ce..1548b923bb 100644 --- a/sdk/storage_blobs/src/blob/requests/get_blob_properties_builder.rs +++ b/sdk/storage_blobs/src/blob/requests/get_blob_properties_builder.rs @@ -61,9 +61,6 @@ impl<'a> GetBlobPropertiesBuilder<'a> { // TODO: Fix this //let blob = Blob::from_headers(&blob_name, &container_name, snapshot_time, &headers)?; let blob = Blob::from_headers(self.blob_client.blob_name(), response.headers())?; - Ok(GetBlobPropertiesResponse::from_response( - response.headers(), - blob, - )?) + GetBlobPropertiesResponse::from_response(response.headers(), blob) } }