From bbc7945eb866c1d7ff112702f64dbfb0923fc7ad Mon Sep 17 00:00:00 2001 From: Bala FA Date: Wed, 6 Sep 2023 07:52:31 +0530 Subject: [PATCH] Simplify code using clippy (#38) Signed-off-by: Bala.FA --- .github/workflows/rust.yml | 5 +- Cargo.toml | 36 +-- src/s3/args.rs | 147 ++++----- src/s3/client.rs | 606 +++++++++++++++++-------------------- src/s3/http.rs | 66 ++-- src/s3/response.rs | 34 +-- src/s3/signer.rs | 18 +- src/s3/sse.rs | 18 +- src/s3/types.rs | 236 +++++++-------- src/s3/utils.rs | 41 +-- tests/private.key | 6 +- tests/public.crt | 21 +- tests/tests.rs | 161 ++++------ 13 files changed, 667 insertions(+), 728 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index db690b4..71c47c1 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -16,10 +16,11 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Build and Check style + - name: Build run: | - cargo build --verbose cargo fmt --all -- --check + cargo clippy --all-targets --all-features -- -A clippy::result_large_err -A clippy::type_complexity -A clippy::too_many_arguments + cargo build --verbose - name: Run tests run: | diff --git a/Cargo.toml b/Cargo.toml index 4c0bce9..06cec64 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,33 +4,33 @@ version = "0.1.0" edition = "2021" [dependencies] -hyper = { version = "0.14", features = ["full"] } -tokio = { version = "1", features = ["full"] } +hyper = { version = "0.14.27", features = ["full"] } +tokio = { version = "1.32.0", features = ["full"] } derivative = "2.2.0" -multimap = "0.8.3" -urlencoding = "2.1.0" +multimap = "0.9.0" +urlencoding = "2.1.3" lazy_static = "1.4.0" -regex = "1.5.6" -chrono = "0.4.19" -sha2 = "0.10.2" -base64 = "0.13.0" +regex = "1.9.4" +chrono = "0.4.27" +sha2 = "0.10.7" +base64 = "0.21.3" md5 = "0.7.0" -crc = "3.0.0" +crc = "3.0.1" byteorder = "1.4.3" hmac = "0.12.1" hex = "0.4.3" -futures-core = "0.3.21" -bytes = "1.2.0" -futures-util = "0.3.21" +futures-core = "0.3.28" +bytes = "1.4.0" +futures-util = "0.3.28" xmltree = "0.10.3" -http = "0.2.8" -dashmap = "5.3.4" +http = "0.2.9" +dashmap = "5.5.3" rand = "0.8.5" -serde = { version = "1.0.143", features = ["derive"] } -serde_json = "1.0.83" +serde = { version = "1.0.188", features = ["derive"] } +serde_json = "1.0.105" async-std = { version = "1.12.0", features = ["attributes", "tokio1"] } -async-recursion = "1.0.0" +async-recursion = "1.0.4" [dependencies.reqwest] -version = "0.11.11" +version = "0.11.20" features = ["native-tls", "blocking", "rustls-tls", "stream"] diff --git a/src/s3/args.rs b/src/s3/args.rs index 2546e82..90af6fd 100644 --- a/src/s3/args.rs +++ b/src/s3/args.rs @@ -67,10 +67,10 @@ fn object_write_args_headers( let mut tagging = String::new(); for (key, value) in v.iter() { if !tagging.is_empty() { - tagging.push_str("&"); + tagging.push('&'); } tagging.push_str(&urlencode(key)); - tagging.push_str("="); + tagging.push('='); tagging.push_str(&urlencode(value)); } @@ -94,7 +94,7 @@ fn object_write_args_headers( ); } - return map; + map } fn calc_part_info( @@ -146,7 +146,7 @@ fn calc_part_info( )); } - return Ok((psize, part_count)); + Ok((psize, part_count)) } #[derive(Clone, Debug, Default)] @@ -307,7 +307,7 @@ impl<'a> AbortMultipartUploadArgs<'a> { region: None, bucket: bucket_name, object: object_name, - upload_id: upload_id, + upload_id, }) } } @@ -344,7 +344,7 @@ impl<'a> CompleteMultipartUploadArgs<'a> { ))); } - if parts.len() == 0 { + if parts.is_empty() { return Err(Error::EmptyParts(String::from("parts cannot be empty"))); } @@ -354,8 +354,8 @@ impl<'a> CompleteMultipartUploadArgs<'a> { region: None, bucket: bucket_name, object: object_name, - upload_id: upload_id, - parts: parts, + upload_id, + parts, }) } } @@ -437,7 +437,7 @@ impl<'a> PutObjectApiArgs<'a> { tags: None, retention: None, legal_hold: false, - data: data, + data, query_params: None, }) } @@ -495,7 +495,7 @@ impl<'a> UploadPartArgs<'a> { ))); } - if part_number < 1 || part_number > 10000 { + if !(1..=10000).contains(&part_number) { return Err(Error::InvalidPartNumber(String::from( "part number must be between 1 and 1000", ))); @@ -513,9 +513,9 @@ impl<'a> UploadPartArgs<'a> { tags: None, retention: None, legal_hold: false, - upload_id: upload_id, - part_number: part_number, - data: data, + upload_id, + part_number, + data, }) } @@ -581,11 +581,11 @@ impl<'a> PutObjectArgs<'a> { tags: None, retention: None, legal_hold: false, - object_size: object_size, + object_size, part_size: psize, - part_count: part_count, + part_count, content_type: "application/octet-stream", - stream: stream, + stream, }) } @@ -659,13 +659,13 @@ impl<'a> ObjectConditionalReadArgs<'a> { if let Some(o) = offset { range.push_str("bytes="); range.push_str(&o.to_string()); - range.push_str("-"); + range.push('-'); if let Some(l) = length { range.push_str(&(o + l - 1).to_string()); } } - return range; + range } pub fn get_headers(&self) -> Multimap { @@ -673,7 +673,7 @@ impl<'a> ObjectConditionalReadArgs<'a> { let range = self.get_range_value(); if !range.is_empty() { - headers.insert(String::from("Range"), range.clone()); + headers.insert(String::from("Range"), range); } if let Some(v) = self.match_etag { @@ -696,7 +696,7 @@ impl<'a> ObjectConditionalReadArgs<'a> { merge(&mut headers, &v.headers()); } - return headers; + headers } pub fn get_copy_headers(&self) -> Multimap { @@ -704,7 +704,7 @@ impl<'a> ObjectConditionalReadArgs<'a> { let mut copy_source = String::from("/"); copy_source.push_str(self.bucket); - copy_source.push_str("/"); + copy_source.push('/'); copy_source.push_str(self.object); if let Some(v) = self.version_id { copy_source.push_str("?versionId="); @@ -714,7 +714,7 @@ impl<'a> ObjectConditionalReadArgs<'a> { let range = self.get_range_value(); if !range.is_empty() { - headers.insert(String::from("x-amz-copy-source-range"), range.clone()); + headers.insert(String::from("x-amz-copy-source-range"), range); } if let Some(v) = self.match_etag { @@ -746,7 +746,7 @@ impl<'a> ObjectConditionalReadArgs<'a> { merge(&mut headers, &v.copy_headers()); } - return headers; + headers } } @@ -782,7 +782,7 @@ impl<'a> RemoveObjectsApiArgs<'a> { bucket: bucket_name, bypass_governance_mode: false, quiet: true, - objects: objects, + objects, }) } } @@ -809,7 +809,7 @@ impl<'a> RemoveObjectsArgs<'a> { region: None, bucket: bucket_name, bypass_governance_mode: false, - objects: objects, + objects, }) } } @@ -960,7 +960,7 @@ impl<'a> ListObjectsArgs<'a> { recursive: false, use_api_v1: false, include_versions: false, - result_fn: result_fn, + result_fn, }) } } @@ -998,7 +998,7 @@ impl<'a> SelectObjectContentArgs<'a> { object: object_name, version_id: None, ssec: None, - request: request, + request, }) } } @@ -1029,7 +1029,7 @@ impl<'a> ListenBucketNotificationArgs<'a> { prefix: None, suffix: None, events: None, - event_fn: event_fn, + event_fn, }) } } @@ -1068,7 +1068,7 @@ impl<'a> UploadPartCopyArgs<'a> { ))); } - if part_number < 1 || part_number > 10000 { + if !(1..=10000).contains(&part_number) { return Err(Error::InvalidPartNumber(String::from( "part number must be between 1 and 1000", ))); @@ -1080,9 +1080,9 @@ impl<'a> UploadPartCopyArgs<'a> { region: None, bucket: bucket_name, object: object_name, - upload_id: upload_id, - part_number: part_number, - headers: headers, + upload_id, + part_number, + headers, }) } } @@ -1131,7 +1131,7 @@ impl<'a> CopyObjectArgs<'a> { tags: None, retention: None, legal_hold: false, - source: source, + source, metadata_directive: None, tagging_directive: None, }) @@ -1200,7 +1200,7 @@ impl<'a> ComposeSource<'a> { } pub fn get_object_size(&self) -> usize { - return self.object_size.expect("ABORT: ComposeSource::build_headers() must be called prior to this method invocation. This shoud not happen."); + self.object_size.expect("ABORT: ComposeSource::build_headers() must be called prior to this method invocation. This shoud not happen.") } pub fn get_headers(&self) -> Multimap { @@ -1248,7 +1248,7 @@ impl<'a> ComposeSource<'a> { let mut copy_source = String::from("/"); copy_source.push_str(self.bucket); - copy_source.push_str("/"); + copy_source.push('/'); copy_source.push_str(self.object); if let Some(v) = self.version_id { copy_source.push_str("?versionId="); @@ -1291,7 +1291,7 @@ impl<'a> ComposeSource<'a> { self.headers = Some(headers); - return Ok(()); + Ok(()) } } @@ -1336,7 +1336,7 @@ impl<'a> ComposeObjectArgs<'a> { tags: None, retention: None, legal_hold: false, - sources: sources, + sources, }) } @@ -1378,7 +1378,7 @@ impl<'a> SetBucketEncryptionArgs<'a> { extra_query_params: None, region: None, bucket: bucket_name, - config: config, + config, }) } } @@ -1425,7 +1425,7 @@ impl<'a> SetBucketNotificationArgs<'a> { extra_query_params: None, region: None, bucket: bucket_name, - config: config, + config, }) } } @@ -1451,7 +1451,7 @@ impl<'a> SetBucketPolicyArgs<'a> { extra_query_params: None, region: None, bucket: bucket_name, - config: config, + config, }) } } @@ -1492,7 +1492,7 @@ impl<'a> SetBucketTagsArgs<'a> { extra_query_params: None, region: None, bucket: bucket_name, - tags: tags, + tags, }) } } @@ -1517,7 +1517,7 @@ impl<'a> SetBucketVersioningArgs<'a> { extra_query_params: None, region: None, bucket: bucket_name, - status: status, + status, mfa_delete: None, }) } @@ -1547,7 +1547,7 @@ impl<'a> SetObjectLockConfigArgs<'a> { extra_query_params: None, region: None, bucket: bucket_name, - config: config, + config, }) } } @@ -1628,7 +1628,7 @@ impl<'a> SetObjectTagsArgs<'a> { bucket: bucket_name, object: object_name, version_id: None, - tags: tags, + tags, }) } } @@ -1664,7 +1664,7 @@ impl<'a> GetPresignedObjectUrlArgs<'a> { bucket: bucket_name, object: object_name, version_id: None, - method: method, + method, expiry_seconds: Some(DEFAULT_EXPIRY_SECONDS), request_time: None, }) @@ -1693,7 +1693,7 @@ impl<'a> PostPolicy<'a> { Ok(PostPolicy { region: None, bucket: bucket_name, - expiration: expiration, + expiration, eq_conditions: HashMap::new(), starts_with_conditions: HashMap::new(), lower_limit: None, @@ -1703,35 +1703,35 @@ impl<'a> PostPolicy<'a> { fn trim_dollar(value: &str) -> String { let mut s = value.to_string(); - if s.starts_with("$") { + if s.starts_with('$') { s.remove(0); } - return s; + s } fn is_reserved_element(element: &str) -> bool { - return element == "bucket" + element == "bucket" || element == "x-amz-algorithm" || element == "x-amz-credential" || element == "x-amz-date" || element == "policy" - || element == "x-amz-signature"; + || element == "x-amz-signature" } fn get_credential_string(access_key: &String, date: &UtcTime, region: &String) -> String { - return format!( + format!( "{}/{}/{}/s3/aws4_request", access_key, to_signer_date(*date), region - ); + ) } pub fn add_equals_condition(&mut self, element: &str, value: &str) -> Result<(), Error> { if element.is_empty() { - return Err(Error::PostPolicyError(format!( - "condition element cannot be empty" - ))); + return Err(Error::PostPolicyError( + "condition element cannot be empty".to_string(), + )); } let v = PostPolicy::trim_dollar(element); @@ -1742,7 +1742,7 @@ impl<'a> PostPolicy<'a> { ))); } - if PostPolicy::is_reserved_element(&v.as_str()) { + if PostPolicy::is_reserved_element(v.as_str()) { return Err(Error::PostPolicyError(format!("{} cannot set", element))); } @@ -1756,9 +1756,9 @@ impl<'a> PostPolicy<'a> { pub fn add_starts_with_condition(&mut self, element: &str, value: &str) -> Result<(), Error> { if element.is_empty() { - return Err(Error::PostPolicyError(format!( - "condition element cannot be empty" - ))); + return Err(Error::PostPolicyError( + "condition element cannot be empty".to_string(), + )); } let v = PostPolicy::trim_dollar(element); @@ -1772,12 +1772,11 @@ impl<'a> PostPolicy<'a> { ))); } - if PostPolicy::is_reserved_element(&v.as_str()) { + if PostPolicy::is_reserved_element(v.as_str()) { return Err(Error::PostPolicyError(format!("{} cannot set", element))); } - self.starts_with_conditions - .insert(v.clone(), value.to_string()); + self.starts_with_conditions.insert(v, value.to_string()); Ok(()) } @@ -1791,9 +1790,9 @@ impl<'a> PostPolicy<'a> { upper_limit: usize, ) -> Result<(), Error> { if lower_limit > upper_limit { - return Err(Error::PostPolicyError(format!( - "lower limit cannot be greater than upper limit" - ))); + return Err(Error::PostPolicyError( + "lower limit cannot be greater than upper limit".to_string(), + )); } self.lower_limit = Some(lower_limit); @@ -1814,24 +1813,26 @@ impl<'a> PostPolicy<'a> { region: String, ) -> Result, Error> { if region.is_empty() { - return Err(Error::PostPolicyError(format!("region cannot be empty"))); + return Err(Error::PostPolicyError("region cannot be empty".to_string())); } if !self.eq_conditions.contains_key("key") && !self.starts_with_conditions.contains_key("key") { - return Err(Error::PostPolicyError(format!("key condition must be set"))); + return Err(Error::PostPolicyError( + "key condition must be set".to_string(), + )); } let mut conditions: Vec = Vec::new(); conditions.push(json!([PostPolicy::EQ, "$bucket", self.bucket])); for (key, value) in &self.eq_conditions { - conditions.push(json!([PostPolicy::EQ, String::from("$") + &key, value])); + conditions.push(json!([PostPolicy::EQ, String::from("$") + key, value])); } for (key, value) in &self.starts_with_conditions { conditions.push(json!([ PostPolicy::STARTS_WITH, - String::from("$") + &key, + String::from("$") + key, value ])); } @@ -1916,7 +1917,7 @@ impl<'a> DownloadObjectArgs<'a> { object: object_name, version_id: None, ssec: None, - filename: filename, + filename, overwrite: false, }) } @@ -1978,11 +1979,11 @@ impl<'a> UploadObjectArgs<'a> { tags: None, retention: None, legal_hold: false, - object_size: object_size, + object_size, part_size: psize, - part_count: part_count, + part_count, content_type: "application/octet-stream", - filename: filename, + filename, }) } } diff --git a/src/s3/client.rs b/src/s3/client.rs index 4601b55..8ef5ac4 100644 --- a/src/s3/client.rs +++ b/src/s3/client.rs @@ -55,7 +55,7 @@ fn url_decode( return Ok(Some(v.to_string())); } - return Ok(None); + Ok(None) } fn add_common_list_objects_query_params( @@ -92,18 +92,18 @@ fn parse_common_list_objects_response( ), Error, > { - let encoding_type = get_option_text(&root, "EncodingType"); - let prefix = url_decode(&encoding_type, Some(get_default_text(&root, "Prefix")))?; + let encoding_type = get_option_text(root, "EncodingType"); + let prefix = url_decode(&encoding_type, Some(get_default_text(root, "Prefix")))?; Ok(( - get_text(&root, "Name")?, + get_text(root, "Name")?, encoding_type, prefix, - get_option_text(&root, "Delimiter"), - match get_option_text(&root, "IsTruncated") { + get_option_text(root, "Delimiter"), + match get_option_text(root, "IsTruncated") { Some(v) => v.to_lowercase() == "true", None => false, }, - match get_option_text(&root, "MaxKeys") { + match get_option_text(root, "MaxKeys") { Some(v) => Some(v.parse::()?), None => None, }, @@ -117,13 +117,9 @@ fn parse_list_objects_contents( encoding_type: &Option, is_delete_marker: bool, ) -> Result<(), Error> { - loop { - let content = match root.take_child(tag) { - Some(v) => v, - None => break, - }; - - let etype = encoding_type.as_ref().map(|v| v.clone()); + while let Some(v) = root.take_child(tag) { + let content = v; + let etype = encoding_type.as_ref().cloned(); let key = url_decode(&etype, Some(get_text(&content, "Key")?))?.unwrap(); let last_modified = Some(from_iso8601utc(&get_text(&content, "LastModified")?)?); let etag = get_option_text(&content, "ETag"); @@ -136,10 +132,7 @@ fn parse_list_objects_contents( let is_latest = get_default_text(&content, "IsLatest").to_lowercase() == "true"; let version_id = get_option_text(&content, "VersionId"); let (owner_id, owner_name) = match content.get_child("Owner") { - Some(v) => ( - get_option_text(&v, "ID"), - get_option_text(&v, "DisplayName"), - ), + Some(v) => (get_option_text(v, "ID"), get_option_text(v, "DisplayName")), None => (None, None), }; let user_metadata = match content.get_child("UserMetadata") { @@ -148,7 +141,7 @@ fn parse_list_objects_contents( for xml_node in &v.children { let u = xml_node .as_element() - .ok_or(Error::XmlError(format!("unable to convert to element")))?; + .ok_or(Error::XmlError("unable to convert to element".to_string()))?; map.insert( u.name.to_string(), u.get_text().unwrap_or_default().to_string(), @@ -161,17 +154,17 @@ fn parse_list_objects_contents( contents.push(Item { name: key, - last_modified: last_modified, - etag: etag, - owner_id: owner_id, - owner_name: owner_name, - size: size, - storage_class: storage_class, - is_latest: is_latest, - version_id: version_id, - user_metadata: user_metadata, + last_modified, + etag, + owner_id, + owner_name, + size, + storage_class, + is_latest, + version_id, + user_metadata, is_prefix: false, - is_delete_marker: is_delete_marker, + is_delete_marker, encoding_type: etype, }); } @@ -184,14 +177,10 @@ fn parse_list_objects_common_prefixes( root: &mut Element, encoding_type: &Option, ) -> Result<(), Error> { - loop { - let common_prefix = match root.take_child("CommonPrefixes") { - Some(v) => v, - None => break, - }; - + while let Some(v) = root.take_child("CommonPrefixes") { + let common_prefix = v; contents.push(Item { - name: url_decode(&encoding_type, Some(get_text(&common_prefix, "Prefix")?))?.unwrap(), + name: url_decode(encoding_type, Some(get_text(&common_prefix, "Prefix")?))?.unwrap(), last_modified: None, etag: None, owner_id: None, @@ -203,7 +192,7 @@ fn parse_list_objects_common_prefixes( user_metadata: None, is_prefix: true, is_delete_marker: false, - encoding_type: encoding_type.as_ref().map(|v| v.clone()), + encoding_type: encoding_type.as_ref().cloned(), }); } @@ -218,19 +207,17 @@ pub struct Client<'a> { pub ignore_cert_check: bool, pub user_agent: String, region_map: DashMap, - debug: bool, } impl<'a> Client<'a> { pub fn new(base_url: BaseUrl, provider: Option<&(dyn Provider + Send + Sync)>) -> Client { Client { - base_url: base_url, - provider: provider, + base_url, + provider, ssl_cert_file: String::new(), ignore_cert_check: false, user_agent: String::new(), region_map: DashMap::new(), - debug: false, } } @@ -238,7 +225,7 @@ impl<'a> Client<'a> { &self, headers: &mut Multimap, query_params: &Multimap, - region: &String, + region: &str, url: &Url, method: &Method, data: &[u8], @@ -292,7 +279,7 @@ impl<'a> Client<'a> { ); } sign_v4_s3( - &method, + method, &url.path, region, headers, @@ -342,7 +329,7 @@ impl<'a> Client<'a> { } } - return Ok((code, message)); + Ok((code, message)) } fn get_error_response( @@ -356,7 +343,7 @@ impl<'a> Client<'a> { object_name: Option<&str>, retry: bool, ) -> Error { - if body.len() > 0 { + if !body.is_empty() { return match header_map.get("Content-Type") { Some(v) => match v.to_str() { Ok(s) => match s.to_lowercase().contains("application/xml") { @@ -438,11 +425,11 @@ impl<'a> Client<'a> { }; Error::S3Error(ErrorResponse { - code: code, - message: message, + code, + message, resource: resource.to_string(), - request_id: request_id, - host_id: host_id, + request_id, + host_id, bucket_name: bucket_name.unwrap_or_default().to_string(), object_name: object_name.unwrap_or_default().to_string(), }) @@ -471,7 +458,7 @@ impl<'a> Client<'a> { } if !self.ssl_cert_file.is_empty() { let mut buf = Vec::new(); - File::open(self.ssl_cert_file.to_string())?.read_to_end(&mut buf)?; + File::open(&self.ssl_cert_file)?.read_to_end(&mut buf)?; let cert = reqwest::Certificate::from_pem(&buf)?; builder = builder.add_root_certificate(cert); } @@ -520,7 +507,7 @@ impl<'a> Client<'a> { _ => return Err(e), }; - return Err(e); + Err(e) } pub async fn execute( @@ -631,7 +618,7 @@ impl<'a> Client<'a> { &self, args: &AbortMultipartUploadArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -649,8 +636,8 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), - Some(&args.object), + Some(args.bucket), + Some(args.object), None, ) .await?; @@ -666,7 +653,7 @@ impl<'a> Client<'a> { pub async fn bucket_exists(&self, args: &BucketExistsArgs<'_>) -> Result { let region; - match self.get_region(&args.bucket, args.region).await { + match self.get_region(args.bucket, args.region).await { Ok(r) => region = r, Err(e) => match e { Error::S3Error(ref er) => { @@ -693,8 +680,8 @@ impl<'a> Client<'a> { Method::HEAD, ®ion, &mut headers, - &query_params, - Some(&args.bucket), + query_params, + Some(args.bucket), None, None, ) @@ -706,9 +693,9 @@ impl<'a> Client<'a> { if er.code == "NoSuchBucket" { return Ok(false); } - return Err(e); + Err(e) } - _ => return Err(e), + _ => Err(e), }, } } @@ -717,7 +704,7 @@ impl<'a> Client<'a> { &self, args: &CompleteMultipartUploadArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut data = String::from(""); for part in args.parts.iter() { @@ -752,9 +739,9 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), - Some(&args.object), - Some(&b), + Some(args.bucket), + Some(args.object), + Some(b), ) .await?; let header_map = resp.headers().clone(); @@ -863,7 +850,7 @@ impl<'a> Client<'a> { } } - return Ok(part_count); + Ok(part_count) } #[async_recursion(?Send)] @@ -872,7 +859,7 @@ impl<'a> Client<'a> { args: &mut ComposeObjectArgs<'_>, upload_id: &mut String, ) -> Result { - let part_count = self.calculate_part_count(&mut args.sources).await?; + let part_count = self.calculate_part_count(args.sources).await?; if part_count == 1 && args.sources[0].offset.is_none() && args.sources[0].length.is_none() { let mut source = @@ -1001,7 +988,7 @@ impl<'a> Client<'a> { let mut cmu_args = CompleteMultipartUploadArgs::new(args.bucket, args.object, upload_id, &parts)?; cmu_args.region = args.region; - return self.complete_multipart_upload(&cmu_args).await; + self.complete_multipart_upload(&cmu_args).await } pub async fn compose_object( @@ -1017,11 +1004,11 @@ impl<'a> Client<'a> { let mut upload_id = String::new(); let res = self.do_compose_object(args, &mut upload_id).await; if res.is_err() && !upload_id.is_empty() { - let amuargs = &AbortMultipartUploadArgs::new(&args.bucket, &args.object, &upload_id)?; - self.abort_multipart_upload(&amuargs).await?; + let amuargs = &AbortMultipartUploadArgs::new(args.bucket, args.object, &upload_id)?; + self.abort_multipart_upload(amuargs).await?; } - return res; + res } pub async fn copy_object( @@ -1101,7 +1088,7 @@ impl<'a> Client<'a> { merge(&mut query_params, v); } - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let resp = self .execute( @@ -1109,8 +1096,8 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), - Some(&args.object), + Some(args.bucket), + Some(args.object), None, ) .await?; @@ -1136,7 +1123,7 @@ impl<'a> Client<'a> { &self, args: &CreateMultipartUploadArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -1161,8 +1148,8 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), - Some(&args.object), + Some(args.bucket), + Some(args.object), None, ) .await?; @@ -1183,7 +1170,7 @@ impl<'a> Client<'a> { &self, args: &DeleteBucketEncryptionArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -1202,7 +1189,7 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, None, ) @@ -1222,9 +1209,9 @@ impl<'a> Client<'a> { bucket_name: args.bucket.to_string(), }); } - return Err(e); + Err(e) } - _ => return Err(e), + _ => Err(e), }, } } @@ -1233,7 +1220,7 @@ impl<'a> Client<'a> { &self, args: &DisableObjectLegalHoldArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -1255,8 +1242,8 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), - Some(&args.object), + Some(args.bucket), + Some(args.object), Some(b"OFF"), ) .await?; @@ -1274,7 +1261,7 @@ impl<'a> Client<'a> { &self, args: &DeleteBucketLifecycleArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -1293,7 +1280,7 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, None, ) @@ -1328,7 +1315,7 @@ impl<'a> Client<'a> { &self, args: &DeleteBucketPolicyArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -1347,7 +1334,7 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, None, ) @@ -1367,9 +1354,9 @@ impl<'a> Client<'a> { bucket_name: args.bucket.to_string(), }); } - return Err(e); + Err(e) } - _ => return Err(e), + _ => Err(e), }, } } @@ -1378,7 +1365,7 @@ impl<'a> Client<'a> { &self, args: &DeleteBucketReplicationArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -1397,7 +1384,7 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, None, ) @@ -1417,9 +1404,9 @@ impl<'a> Client<'a> { bucket_name: args.bucket.to_string(), }); } - return Err(e); + Err(e) } - _ => return Err(e), + _ => Err(e), }, } } @@ -1428,7 +1415,7 @@ impl<'a> Client<'a> { &self, args: &DeleteBucketTagsArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -1447,7 +1434,7 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, None, ) @@ -1482,7 +1469,7 @@ impl<'a> Client<'a> { &self, args: &DeleteObjectTagsArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -1504,8 +1491,8 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), - Some(&args.object), + Some(args.bucket), + Some(args.object), None, ) .await?; @@ -1556,7 +1543,7 @@ impl<'a> Client<'a> { Ok(DownloadObjectResponse { headers: resp.headers().clone(), - region: args.region.map_or(String::new(), |v| String::from(v)), + region: args.region.map_or(String::new(), String::from), bucket_name: args.bucket.to_string(), object_name: args.object.to_string(), version_id: args.version_id.as_ref().map(|v| v.to_string()), @@ -1567,7 +1554,7 @@ impl<'a> Client<'a> { &self, args: &EnableObjectLegalHoldArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -1589,8 +1576,8 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), - Some(&args.object), + Some(args.bucket), + Some(args.object), Some(b"ON"), ) .await?; @@ -1608,7 +1595,7 @@ impl<'a> Client<'a> { &self, args: &GetBucketEncryptionArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -1627,7 +1614,7 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, None, ) @@ -1660,7 +1647,7 @@ impl<'a> Client<'a> { &self, args: &GetBucketLifecycleArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -1679,7 +1666,7 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, None, ) @@ -1690,12 +1677,12 @@ impl<'a> Client<'a> { let body = resp.bytes().await?; let root = Element::parse(body.reader())?; - return Ok(GetBucketLifecycleResponse { + Ok(GetBucketLifecycleResponse { headers: header_map.clone(), region: region.clone(), bucket_name: args.bucket.to_string(), config: LifecycleConfig::from_xml(&root)?, - }); + }) } Err(e) => match e { Error::S3Error(ref err) => { @@ -1707,9 +1694,9 @@ impl<'a> Client<'a> { config: LifecycleConfig { rules: Vec::new() }, }); } - return Err(e); + Err(e) } - _ => return Err(e), + _ => Err(e), }, } } @@ -1718,7 +1705,7 @@ impl<'a> Client<'a> { &self, args: &GetBucketNotificationArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -1737,7 +1724,7 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, None, ) @@ -1747,19 +1734,19 @@ impl<'a> Client<'a> { let body = resp.bytes().await?; let mut root = Element::parse(body.reader())?; - return Ok(GetBucketNotificationResponse { + Ok(GetBucketNotificationResponse { headers: header_map.clone(), region: region.clone(), bucket_name: args.bucket.to_string(), config: NotificationConfig::from_xml(&mut root)?, - }); + }) } pub async fn get_bucket_policy( &self, args: &GetBucketPolicyArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -1778,7 +1765,7 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, None, ) @@ -1802,9 +1789,9 @@ impl<'a> Client<'a> { config: String::from("{}"), }); } - return Err(e); + Err(e) } - _ => return Err(e), + _ => Err(e), }, } } @@ -1813,7 +1800,7 @@ impl<'a> Client<'a> { &self, args: &GetBucketReplicationArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -1832,7 +1819,7 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, None, ) @@ -1842,19 +1829,19 @@ impl<'a> Client<'a> { let body = resp.bytes().await?; let root = Element::parse(body.reader())?; - return Ok(GetBucketReplicationResponse { + Ok(GetBucketReplicationResponse { headers: header_map.clone(), region: region.clone(), bucket_name: args.bucket.to_string(), config: ReplicationConfig::from_xml(&root)?, - }); + }) } pub async fn get_bucket_tags( &self, args: &GetBucketTagsArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -1873,7 +1860,7 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, None, ) @@ -1886,21 +1873,18 @@ impl<'a> Client<'a> { let element = root .get_mut_child("TagSet") - .ok_or(Error::XmlError(format!(" tag not found")))?; + .ok_or(Error::XmlError(" tag not found".to_string()))?; let mut tags = std::collections::HashMap::new(); - loop { - match element.take_child("Tag") { - Some(v) => tags.insert(get_text(&v, "Key")?, get_text(&v, "Value")?), - _ => break, - }; + while let Some(v) = element.take_child("Tag") { + tags.insert(get_text(&v, "Key")?, get_text(&v, "Value")?); } - return Ok(GetBucketTagsResponse { + Ok(GetBucketTagsResponse { headers: header_map.clone(), region: region.clone(), bucket_name: args.bucket.to_string(), - tags: tags, - }); + tags, + }) } Err(e) => match e { Error::S3Error(ref err) => { @@ -1912,9 +1896,9 @@ impl<'a> Client<'a> { tags: HashMap::new(), }); } - return Err(e); + Err(e) } - _ => return Err(e), + _ => Err(e), }, } } @@ -1923,7 +1907,7 @@ impl<'a> Client<'a> { &self, args: &GetBucketVersioningArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -1942,7 +1926,7 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, None, ) @@ -1952,13 +1936,13 @@ impl<'a> Client<'a> { let body = resp.bytes().await?; let root = Element::parse(body.reader())?; - return Ok(GetBucketVersioningResponse { + Ok(GetBucketVersioningResponse { headers: header_map.clone(), region: region.clone(), bucket_name: args.bucket.to_string(), status: get_option_text(&root, "Status").map(|v| v == "Enabled"), mfa_delete: get_option_text(&root, "MFADelete").map(|v| v == "Enabled"), - }); + }) } pub async fn get_object(&self, args: &GetObjectArgs<'_>) -> Result { @@ -1966,7 +1950,7 @@ impl<'a> Client<'a> { return Err(Error::SseTlsRequired(None)); } - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -1987,8 +1971,8 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), - Some(&args.object), + Some(args.bucket), + Some(args.object), None, ) .await @@ -1998,7 +1982,7 @@ impl<'a> Client<'a> { &self, args: &GetObjectLockConfigArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -2017,7 +2001,7 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, None, ) @@ -2027,19 +2011,19 @@ impl<'a> Client<'a> { let body = resp.bytes().await?; let root = Element::parse(body.reader())?; - return Ok(GetObjectLockConfigResponse { + Ok(GetObjectLockConfigResponse { headers: header_map.clone(), region: region.clone(), bucket_name: args.bucket.to_string(), config: ObjectLockConfig::from_xml(&root)?, - }); + }) } pub async fn get_object_retention( &self, args: &GetObjectRetentionArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -2061,8 +2045,8 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), - Some(&args.object), + Some(args.bucket), + Some(args.object), None, ) .await @@ -2101,9 +2085,9 @@ impl<'a> Client<'a> { retain_until_date: None, }); } - return Err(e); + Err(e) } - _ => return Err(e), + _ => Err(e), }, } } @@ -2112,7 +2096,7 @@ impl<'a> Client<'a> { &self, args: &GetObjectTagsArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -2134,8 +2118,8 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), - Some(&args.object), + Some(args.bucket), + Some(args.object), None, ) .await?; @@ -2146,13 +2130,10 @@ impl<'a> Client<'a> { let element = root .get_mut_child("TagSet") - .ok_or(Error::XmlError(format!(" tag not found")))?; + .ok_or(Error::XmlError(" tag not found".to_string()))?; let mut tags = std::collections::HashMap::new(); - loop { - match element.take_child("Tag") { - Some(v) => tags.insert(get_text(&v, "Key")?, get_text(&v, "Value")?), - _ => break, - }; + while let Some(v) = element.take_child("Tag") { + tags.insert(get_text(&v, "Key")?, get_text(&v, "Value")?); } return Ok(GetObjectTagsResponse { @@ -2161,7 +2142,7 @@ impl<'a> Client<'a> { bucket_name: args.bucket.to_string(), object_name: args.object.to_string(), version_id: args.version_id.as_ref().map(|v| v.to_string()), - tags: tags, + tags, }); } @@ -2169,7 +2150,7 @@ impl<'a> Client<'a> { &self, args: &GetPresignedObjectUrlArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut query_params = Multimap::new(); if let Some(v) = &args.extra_query_params { @@ -2227,12 +2208,12 @@ impl<'a> Client<'a> { policy: &PostPolicy<'_>, ) -> Result, Error> { if self.provider.is_none() { - return Err(Error::PostPolicyError(format!( - "anonymous access does not require presigned post form-data" - ))); + return Err(Error::PostPolicyError( + "anonymous access does not require presigned post form-data".to_string(), + )); } - let region = self.get_region(&policy.bucket, policy.region).await?; + let region = self.get_region(policy.bucket, policy.region).await?; let creds = self.provider.unwrap().fetch(); policy.form_data( creds.access_key, @@ -2246,7 +2227,7 @@ impl<'a> Client<'a> { &self, args: &IsObjectLegalHoldEnabledArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -2268,8 +2249,8 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), - Some(&args.object), + Some(args.bucket), + Some(args.object), None, ) .await @@ -2299,9 +2280,9 @@ impl<'a> Client<'a> { enabled: false, }); } - return Err(e); + Err(e) } - _ => return Err(e), + _ => Err(e), }, } } @@ -2323,7 +2304,7 @@ impl<'a> Client<'a> { Method::GET, &String::from("us-east-1"), &mut headers, - &query_params, + query_params, None, None, None, @@ -2337,12 +2318,8 @@ impl<'a> Client<'a> { .ok_or(Error::XmlError(String::from(" tag not found")))?; let mut bucket_list: Vec = Vec::new(); - loop { - let bucket = match buckets.take_child("Bucket") { - Some(b) => b, - None => break, - }; - + while let Some(b) = buckets.take_child("Bucket") { + let bucket = b; bucket_list.push(Bucket { name: get_text(&bucket, "Name")?, creation_date: from_iso8601utc(&get_text(&bucket, "CreationDate")?)?, @@ -2365,7 +2342,7 @@ impl<'a> Client<'a> { ))); } - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -2398,7 +2375,7 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, None, ) @@ -2419,9 +2396,10 @@ impl<'a> Client<'a> { buf.extend(chunk.iter().copied()); while !done { - match buf.iter().position(|&v| v == '\n' as u8) { + match buf.iter().position(|&v| v == b'\n') { Some(i) => { let mut data = vec![0_u8; i + 1]; + #[allow(clippy::needless_range_loop)] for j in 0..=i { data[j] = buf.pop_front().ok_or(Error::InsufficientData(i, j))?; } @@ -2440,7 +2418,7 @@ impl<'a> Client<'a> { Ok(ListenBucketNotificationResponse::new( header_map, ®ion, - &args.bucket, + args.bucket, )) } @@ -2448,7 +2426,7 @@ impl<'a> Client<'a> { &self, args: &ListObjectsV1Args<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -2476,7 +2454,7 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, None, ) @@ -2492,24 +2470,21 @@ impl<'a> Client<'a> { let mut contents: Vec = Vec::new(); parse_list_objects_contents(&mut contents, &mut root, "Contents", &encoding_type, false)?; if is_truncated && next_marker.is_none() { - next_marker = match contents.last() { - Some(v) => Some(v.name.clone()), - None => None, - } + next_marker = contents.last().map(|v| v.name.clone()) } parse_list_objects_common_prefixes(&mut contents, &mut root, &encoding_type)?; Ok(ListObjectsV1Response { headers: header_map, - name: name, - encoding_type: encoding_type, - prefix: prefix, - delimiter: delimiter, - is_truncated: is_truncated, - max_keys: max_keys, - contents: contents, - marker: marker, - next_marker: next_marker, + name, + encoding_type, + prefix, + delimiter, + is_truncated, + max_keys, + contents, + marker, + next_marker, }) } @@ -2517,7 +2492,7 @@ impl<'a> Client<'a> { &self, args: &ListObjectsV2Args<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -2555,7 +2530,7 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, None, ) @@ -2583,17 +2558,17 @@ impl<'a> Client<'a> { Ok(ListObjectsV2Response { headers: header_map, - name: name, - encoding_type: encoding_type, - prefix: prefix, - delimiter: delimiter, - is_truncated: is_truncated, - max_keys: max_keys, - contents: contents, - key_count: key_count, - start_after: start_after, - continuation_token: continuation_token, - next_continuation_token: next_continuation_token, + name, + encoding_type, + prefix, + delimiter, + is_truncated, + max_keys, + contents, + key_count, + start_after, + continuation_token, + next_continuation_token, }) } @@ -2601,7 +2576,7 @@ impl<'a> Client<'a> { &self, args: &ListObjectVersionsArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -2633,7 +2608,7 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, None, ) @@ -2661,22 +2636,22 @@ impl<'a> Client<'a> { Ok(ListObjectVersionsResponse { headers: header_map, - name: name, - encoding_type: encoding_type, - prefix: prefix, - delimiter: delimiter, - is_truncated: is_truncated, - max_keys: max_keys, - contents: contents, - key_marker: key_marker, - next_key_marker: next_key_marker, - version_id_marker: version_id_marker, - next_version_id_marker: next_version_id_marker, + name, + encoding_type, + prefix, + delimiter, + is_truncated, + max_keys, + contents, + key_marker, + next_key_marker, + version_id_marker, + next_version_id_marker, }) } pub async fn list_objects(&self, args: &ListObjectsArgs<'_>) -> Result<(), Error> { - let mut lov1_args = ListObjectsV1Args::new(&args.bucket)?; + let mut lov1_args = ListObjectsV1Args::new(args.bucket)?; lov1_args.extra_headers = args.extra_headers; lov1_args.extra_query_params = args.extra_query_params; lov1_args.region = args.region; @@ -2693,7 +2668,7 @@ impl<'a> Client<'a> { lov1_args.prefix = args.prefix; lov1_args.marker = args.marker.map(|x| x.to_string()); - let mut lov2_args = ListObjectsV2Args::new(&args.bucket)?; + let mut lov2_args = ListObjectsV2Args::new(args.bucket)?; lov2_args.extra_headers = args.extra_headers; lov2_args.extra_query_params = args.extra_query_params; lov2_args.region = args.region; @@ -2713,7 +2688,7 @@ impl<'a> Client<'a> { lov2_args.fetch_owner = args.fetch_owner; lov2_args.include_user_metadata = args.include_user_metadata; - let mut lov_args = ListObjectVersionsArgs::new(&args.bucket)?; + let mut lov_args = ListObjectVersionsArgs::new(args.bucket)?; lov_args.extra_headers = args.extra_headers; lov_args.extra_query_params = args.extra_query_params; lov_args.region = args.region; @@ -2811,8 +2786,8 @@ impl<'a> Client<'a> { Method::PUT, ®ion.to_string(), &mut headers, - &query_params, - Some(&args.bucket), + query_params, + Some(args.bucket), None, body, ) @@ -2887,7 +2862,7 @@ impl<'a> Client<'a> { } } else { let mut size = part_size + 1; - let mut newbuf = match one_byte.len() == 1 { + let newbuf = match one_byte.len() == 1 { true => { buf[0] = one_byte.pop().unwrap(); size -= 1; @@ -2897,7 +2872,7 @@ impl<'a> Client<'a> { false => buf, }; - let n = Client::read_part(&mut args.stream, &mut newbuf, size)?; + let n = Client::read_part(&mut args.stream, newbuf, size)?; bytes_read += n; // If bytes read is less than or equals to part size, then we have reached last part. @@ -2914,7 +2889,7 @@ impl<'a> Client<'a> { uploaded_size += part_size; if part_count == 1_i16 { - let mut poaargs = PutObjectApiArgs::new(&args.bucket, &args.object, &data)?; + let mut poaargs = PutObjectApiArgs::new(args.bucket, args.object, data)?; poaargs.extra_query_params = args.extra_query_params; poaargs.region = args.region; poaargs.headers = Some(&headers); @@ -2923,7 +2898,7 @@ impl<'a> Client<'a> { } if upload_id.is_empty() { - let mut cmuargs = CreateMultipartUploadArgs::new(&args.bucket, &args.object)?; + let mut cmuargs = CreateMultipartUploadArgs::new(args.bucket, args.object)?; cmuargs.extra_query_params = args.extra_query_params; cmuargs.region = args.region; cmuargs.headers = Some(&headers); @@ -2933,11 +2908,11 @@ impl<'a> Client<'a> { } let mut upargs = UploadPartArgs::new( - &args.bucket, - &args.object, - &upload_id, + args.bucket, + args.object, + upload_id, part_number as u16, - &data, + data, )?; upargs.region = args.region; @@ -2958,10 +2933,10 @@ impl<'a> Client<'a> { } let mut cmuargs = - CompleteMultipartUploadArgs::new(&args.bucket, &args.object, &upload_id, &parts)?; + CompleteMultipartUploadArgs::new(args.bucket, args.object, upload_id, &parts)?; cmuargs.region = args.region; - return self.complete_multipart_upload(&cmuargs).await; + self.complete_multipart_upload(&cmuargs).await } pub async fn put_object( @@ -2975,8 +2950,8 @@ impl<'a> Client<'a> { } let bufsize = match args.part_count > 0 { - true => args.part_size as usize, - false => (args.part_size as usize) + 1, + true => args.part_size, + false => args.part_size + 1, }; let mut buf = vec![0_u8; bufsize]; @@ -2986,18 +2961,18 @@ impl<'a> Client<'a> { std::mem::drop(buf); if res.is_err() && !upload_id.is_empty() { - let amuargs = &AbortMultipartUploadArgs::new(&args.bucket, &args.object, &upload_id)?; - self.abort_multipart_upload(&amuargs).await?; + let amuargs = &AbortMultipartUploadArgs::new(args.bucket, args.object, &upload_id)?; + self.abort_multipart_upload(amuargs).await?; } - return res; + res } pub async fn put_object_api( &self, args: &PutObjectApiArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = args.get_headers(); @@ -3015,9 +2990,9 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), - Some(&args.object), - Some(&args.data), + Some(args.bucket), + Some(args.object), + Some(args.data), ) .await?; let header_map = resp.headers(); @@ -3042,7 +3017,7 @@ impl<'a> Client<'a> { &self, args: &RemoveBucketArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -3058,8 +3033,8 @@ impl<'a> Client<'a> { Method::DELETE, ®ion, &mut headers, - &query_params, - Some(&args.bucket), + query_params, + Some(args.bucket), None, None, ) @@ -3077,7 +3052,7 @@ impl<'a> Client<'a> { &self, args: &RemoveObjectArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -3097,8 +3072,8 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), - Some(&args.object), + Some(args.bucket), + Some(args.object), None, ) .await?; @@ -3108,10 +3083,7 @@ impl<'a> Client<'a> { region: region.to_string(), bucket_name: args.bucket.to_string(), object_name: args.object.to_string(), - version_id: match args.version_id { - Some(v) => Some(v.to_string()), - None => None, - }, + version_id: args.version_id.map(|v| v.to_string()), }) } @@ -3119,7 +3091,7 @@ impl<'a> Client<'a> { &self, args: &RemoveObjectsApiArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut data = String::from(""); if args.quiet { @@ -3128,11 +3100,11 @@ impl<'a> Client<'a> { for object in args.objects.iter() { data.push_str(""); data.push_str(""); - data.push_str(&object.name); + data.push_str(object.name); data.push_str(""); if let Some(v) = object.version_id { data.push_str(""); - data.push_str(&v); + data.push_str(v); data.push_str(""); } data.push_str(""); @@ -3168,9 +3140,9 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, - Some(&b), + Some(b), ) .await?; let header_map = resp.headers().clone(); @@ -3178,12 +3150,8 @@ impl<'a> Client<'a> { let mut root = Element::parse(body.reader())?; let mut objects: Vec = Vec::new(); - loop { - let deleted = match root.take_child("Deleted") { - Some(v) => v, - None => break, - }; - + while let Some(v) = root.take_child("Deleted") { + let deleted = v; objects.push(DeletedObject { name: get_text(&deleted, "Key")?, version_id: get_option_text(&deleted, "VersionId"), @@ -3193,12 +3161,8 @@ impl<'a> Client<'a> { } let mut errors: Vec = Vec::new(); - loop { - let error = match root.take_child("Error") { - Some(v) => v, - None => break, - }; - + while let Some(v) = root.take_child("Error") { + let error = v; errors.push(DeleteError { code: get_text(&error, "Code")?, message: get_text(&error, "Message")?, @@ -3211,8 +3175,8 @@ impl<'a> Client<'a> { headers: header_map.clone(), region: region.clone(), bucket_name: args.bucket.to_string(), - objects: objects, - errors: errors, + objects, + errors, }) } @@ -3220,25 +3184,25 @@ impl<'a> Client<'a> { &self, args: &mut RemoveObjectsArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; loop { let mut objects: Vec = Vec::new(); for object in args.objects.take(1000) { objects.push(*object); } - if objects.len() == 0 { + if objects.is_empty() { break; } - let mut roa_args = RemoveObjectsApiArgs::new(&args.bucket, &objects)?; + let mut roa_args = RemoveObjectsApiArgs::new(args.bucket, &objects)?; roa_args.extra_headers = args.extra_headers; roa_args.extra_query_params = args.extra_query_params; roa_args.region = args.region; roa_args.bypass_governance_mode = args.bypass_governance_mode; roa_args.quiet = true; let resp = self.remove_objects_api(&roa_args).await?; - if resp.errors.len() > 0 { + if !resp.errors.is_empty() { return Ok(resp); } } @@ -3256,7 +3220,7 @@ impl<'a> Client<'a> { &self, args: &SetBucketEncryptionArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -3275,7 +3239,7 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, Some(args.config.to_xml().as_bytes()), ) @@ -3292,7 +3256,7 @@ impl<'a> Client<'a> { &self, args: &SetBucketLifecycleArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -3311,7 +3275,7 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, Some(args.config.to_xml().as_bytes()), ) @@ -3328,7 +3292,7 @@ impl<'a> Client<'a> { &self, args: &SetBucketNotificationArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -3347,7 +3311,7 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, Some(args.config.to_xml().as_bytes()), ) @@ -3364,7 +3328,7 @@ impl<'a> Client<'a> { &self, args: &SetBucketPolicyArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -3383,7 +3347,7 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, Some(args.config.as_bytes()), ) @@ -3400,7 +3364,7 @@ impl<'a> Client<'a> { &self, args: &SetBucketReplicationArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -3419,7 +3383,7 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, Some(args.config.to_xml().as_bytes()), ) @@ -3436,7 +3400,7 @@ impl<'a> Client<'a> { &self, args: &SetBucketTagsArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -3455,10 +3419,10 @@ impl<'a> Client<'a> { for (key, value) in args.tags.iter() { data.push_str(""); data.push_str(""); - data.push_str(&key); + data.push_str(key); data.push_str(""); data.push_str(""); - data.push_str(&value); + data.push_str(value); data.push_str(""); data.push_str(""); } @@ -3472,7 +3436,7 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, Some(data.as_bytes()), ) @@ -3489,7 +3453,7 @@ impl<'a> Client<'a> { &self, args: &SetBucketVersioningArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -3525,7 +3489,7 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, Some(data.as_bytes()), ) @@ -3542,7 +3506,7 @@ impl<'a> Client<'a> { &self, args: &SetObjectLockConfigArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -3561,7 +3525,7 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), + Some(args.bucket), None, Some(args.config.to_xml().as_bytes()), ) @@ -3578,7 +3542,7 @@ impl<'a> Client<'a> { &self, args: &SetObjectRetentionArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -3613,7 +3577,7 @@ impl<'a> Client<'a> { } data.push_str(""); - headers.insert(String::from("Content-MD5"), md5sum_hash(&data.as_bytes())); + headers.insert(String::from("Content-MD5"), md5sum_hash(data.as_bytes())); let resp = self .execute( @@ -3621,8 +3585,8 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), - Some(&args.object), + Some(args.bucket), + Some(args.object), Some(data.as_bytes()), ) .await?; @@ -3640,7 +3604,7 @@ impl<'a> Client<'a> { &self, args: &SetObjectTagsArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -3662,10 +3626,10 @@ impl<'a> Client<'a> { for (key, value) in args.tags.iter() { data.push_str(""); data.push_str(""); - data.push_str(&key); + data.push_str(key); data.push_str(""); data.push_str(""); - data.push_str(&value); + data.push_str(value); data.push_str(""); data.push_str(""); } @@ -3679,8 +3643,8 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), - Some(&args.object), + Some(args.bucket), + Some(args.object), Some(data.as_bytes()), ) .await?; @@ -3702,7 +3666,7 @@ impl<'a> Client<'a> { return Err(Error::SseTlsRequired(None)); } - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let data = args.request.to_xml(); let b = data.as_bytes(); @@ -3711,7 +3675,7 @@ impl<'a> Client<'a> { if let Some(v) = &args.extra_headers { merge(&mut headers, v); } - headers.insert(String::from("Content-MD5"), md5sum_hash(&b)); + headers.insert(String::from("Content-MD5"), md5sum_hash(b)); let mut query_params = Multimap::new(); if let Some(v) = &args.extra_query_params { @@ -3726,14 +3690,14 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), - Some(&args.object), - Some(&b), + Some(args.bucket), + Some(args.object), + Some(b), ) .await?, ®ion, - &args.bucket, - &args.object, + args.bucket, + args.object, )) } @@ -3745,7 +3709,7 @@ impl<'a> Client<'a> { return Err(Error::SseTlsRequired(None)); } - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -3767,13 +3731,13 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), - Some(&args.object), + Some(args.bucket), + Some(args.object), None, ) .await?; - StatObjectResponse::new(&resp.headers(), ®ion, &args.bucket, &args.object) + StatObjectResponse::new(resp.headers(), ®ion, args.bucket, args.object) } pub async fn upload_object( @@ -3811,7 +3775,7 @@ impl<'a> Client<'a> { query_params.insert(String::from("partNumber"), args.part_number.to_string()); query_params.insert(String::from("uploadId"), args.upload_id.to_string()); - let mut poa_args = PutObjectApiArgs::new(&args.bucket, &args.object, &args.data)?; + let mut poa_args = PutObjectApiArgs::new(args.bucket, args.object, args.data)?; poa_args.query_params = Some(&query_params); poa_args.extra_headers = args.extra_headers; @@ -3831,7 +3795,7 @@ impl<'a> Client<'a> { &self, args: &UploadPartCopyArgs<'_>, ) -> Result { - let region = self.get_region(&args.bucket, args.region).await?; + let region = self.get_region(args.bucket, args.region).await?; let mut headers = Multimap::new(); if let Some(v) = &args.extra_headers { @@ -3852,8 +3816,8 @@ impl<'a> Client<'a> { ®ion, &mut headers, &query_params, - Some(&args.bucket), - Some(&args.object), + Some(args.bucket), + Some(args.object), None, ) .await?; diff --git a/src/s3/http.rs b/src/s3/http.rs index b729d52..d181a72 100644 --- a/src/s3/http.rs +++ b/src/s3/http.rs @@ -36,7 +36,7 @@ impl Url { if self.port > 0 { return format!("{}:{}", self.host, self.port); } - return self.host.clone(); + self.host.clone() } } @@ -58,7 +58,7 @@ impl fmt::Display for Url { f.write_str(&self.host)?; } - if !self.path.starts_with("/") { + if !self.path.starts_with('/') { f.write_str("/")?; } f.write_str(&self.path)?; @@ -85,7 +85,7 @@ fn extract_region(host: &str) -> String { }, _ => "", }; - return region.to_string(); + region.to_string() } #[derive(Derivative)] @@ -111,22 +111,23 @@ impl BaseUrl { bucket_name: Option<&str>, object_name: Option<&str>, ) -> Result { - if !object_name.map_or(true, |v| v.is_empty()) { - if bucket_name.map_or(true, |v| v.is_empty()) { - return Err(Error::UrlBuildError(String::from( - "empty bucket name provided for object name", - ))); - } + if !object_name.map_or(true, |v| v.is_empty()) && bucket_name.map_or(true, |v| v.is_empty()) + { + return Err(Error::UrlBuildError(String::from( + "empty bucket name provided for object name", + ))); } - let mut url = Url::default(); - url.https = self.https; - url.host = self.host.clone(); - url.port = self.port; - url.query = query.clone(); + let mut url = Url { + https: self.https, + host: self.host.clone(), + port: self.port, + query: query.clone(), + ..Default::default() + }; if bucket_name.is_none() { - url.path.push_str("/"); + url.path.push('/'); if self.aws_host { url.host = format!("s3.{}.{}", region, self.host); } @@ -135,6 +136,7 @@ impl BaseUrl { let bucket = bucket_name.unwrap(); + #[allow(clippy::nonminimal_bool)] let enforce_path_style = true && // CreateBucket API requires path style in Amazon AWS S3. (method == Method::PUT && object_name.is_none() && query.is_empty()) || @@ -163,27 +165,27 @@ impl BaseUrl { } if enforce_path_style || !self.accelerate_host { s3_domain.push_str(region); - s3_domain.push_str("."); + s3_domain.push('.'); } url.host = s3_domain + &url.host; } if enforce_path_style || !self.virtual_style { - url.path.push_str("/"); + url.path.push('/'); url.path.push_str(bucket); } else { url.host = format!("{}.{}", bucket, url.host); } - if object_name.is_some() { - if object_name.unwrap().chars().nth(0) != Some('/') { - url.path.push_str("/"); + if let Some(v) = object_name { + if !v.starts_with('/') { + url.path.push('/'); } // FIXME: urlencode path - url.path.push_str(object_name.unwrap()); + url.path.push_str(v); } - return Ok(url); + Ok(url) } pub fn from_string(s: String) -> Result { @@ -231,7 +233,7 @@ impl BaseUrl { ))); } - if !url.query().is_none() { + if url.query().is_some() { return Err(Error::InvalidBaseUrl(String::from( "query must be none for base URL", ))); @@ -265,15 +267,15 @@ impl BaseUrl { accelerate_host = false; } - return Ok(BaseUrl { - https: https, + Ok(BaseUrl { + https, host: host.to_string(), - port: port, - region: region, - aws_host: aws_host, - accelerate_host: accelerate_host, - dualstack_host: dualstack_host, - virtual_style: virtual_style, - }); + port, + region, + aws_host, + accelerate_host, + dualstack_host, + virtual_style, + }) } } diff --git a/src/s3/response.rs b/src/s3/response.rs index b9f0504..83c98ad 100644 --- a/src/s3/response.rs +++ b/src/s3/response.rs @@ -170,15 +170,15 @@ impl StatObjectResponse { region: region.to_string(), bucket_name: bucket_name.to_string(), object_name: object_name.to_string(), - size: size, + size, etag: etag.to_string(), - version_id: version_id, - last_modified: last_modified, - retention_mode: retention_mode, - retention_retain_until_date: retention_retain_until_date, - legal_hold: legal_hold, - delete_marker: delete_marker, - user_metadata: user_metadata, + version_id, + last_modified, + retention_mode, + retention_retain_until_date, + legal_hold, + delete_marker, + user_metadata, }) } } @@ -324,7 +324,7 @@ impl SelectObjectContentResponse { let headers = resp.headers().clone(); SelectObjectContentResponse { - headers: headers, + headers, region: region.to_string(), bucket_name: bucket_name.to_string(), object_name: object_name.to_string(), @@ -333,7 +333,7 @@ impl SelectObjectContentResponse { bytes_progressed: 0, bytes_returned: 0, }, - resp: resp, + resp, done: false, buf: VecDeque::::new(), prelude: [0_u8; 8], @@ -371,7 +371,7 @@ impl SelectObjectContentResponse { self.prelude[i] = self.buf.pop_front().ok_or(Error::InsufficientData(8, i))?; } - return Ok(true); + Ok(true) } fn read_prelude_crc(&mut self) -> Result { @@ -384,7 +384,7 @@ impl SelectObjectContentResponse { self.prelude_crc[i] = self.buf.pop_front().ok_or(Error::InsufficientData(4, i))?; } - return Ok(true); + Ok(true) } fn read_data(&mut self) -> Result { @@ -404,7 +404,7 @@ impl SelectObjectContentResponse { ); } - return Ok(true); + Ok(true) } fn read_message_crc(&mut self) -> Result { @@ -417,7 +417,7 @@ impl SelectObjectContentResponse { self.message_crc[i] = self.buf.pop_front().ok_or(Error::InsufficientData(4, i))?; } - return Ok(true); + Ok(true) } fn decode_header(&mut self, header_length: usize) -> Result, Error> { @@ -450,7 +450,7 @@ impl SelectObjectContentResponse { headers.insert(name, value); } - return Ok(headers); + Ok(headers) } async fn do_read(&mut self) -> Result<(), Error> { @@ -596,7 +596,7 @@ impl SelectObjectContentResponse { )); } Ok(_) => { - if self.payload.len() == 0 { + if self.payload.is_empty() { self.done = true; return Ok(0); } @@ -620,7 +620,7 @@ impl ListenBucketNotificationResponse { bucket_name: &str, ) -> ListenBucketNotificationResponse { ListenBucketNotificationResponse { - headers: headers, + headers, region: region.to_string(), bucket_name: bucket_name.to_string(), } diff --git a/src/s3/signer.rs b/src/s3/signer.rs index 6119994..6db8a9a 100644 --- a/src/s3/signer.rs +++ b/src/s3/signer.rs @@ -25,20 +25,20 @@ use sha2::Sha256; pub fn hmac_hash(key: &[u8], data: &[u8]) -> Vec { let mut hasher = Hmac::::new_from_slice(key).expect("HMAC can take key of any size"); hasher.update(data); - return hasher.finalize().into_bytes().to_vec(); + hasher.finalize().into_bytes().to_vec() } pub fn hmac_hash_hex(key: &[u8], data: &[u8]) -> String { - return hexencode(hmac_hash(key, data)); + hexencode(hmac_hash(key, data)) } pub fn get_scope(date: UtcTime, region: &str, service_name: &str) -> String { - return format!( + format!( "{}/{}/{}/aws4_request", to_signer_date(date), region, service_name - ); + ) } pub fn get_canonical_request_hash( @@ -64,12 +64,12 @@ pub fn get_canonical_request_hash( } pub fn get_string_to_sign(date: UtcTime, scope: &str, canonical_request_hash: &str) -> String { - return format!( + format!( "AWS4-HMAC-SHA256\n{}\n{}\n{}", to_amz_date(date), scope, canonical_request_hash - ); + ) } pub fn get_signing_key( @@ -97,10 +97,10 @@ pub fn get_authorization( signed_headers: &str, signature: &str, ) -> String { - return format!( + format!( "AWS4-HMAC-SHA256 Credential={}/{}, SignedHeaders={}, Signature={}", access_key, scope, signed_headers, signature - ); + ) } pub fn sign_v4( @@ -220,7 +220,7 @@ pub fn presign_v4( uri, &canonical_query_string, &canonical_headers, - &signed_headers, + signed_headers, "UNSIGNED-PAYLOAD", ); let string_to_sign = get_string_to_sign(date, &scope, &canonical_request_hash); diff --git a/src/s3/sse.rs b/src/s3/sse.rs index 4a1ba42..913b8c3 100644 --- a/src/s3/sse.rs +++ b/src/s3/sse.rs @@ -55,16 +55,16 @@ impl SseCustomerKey { ); copy_headers.insert( String::from("X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key"), - b64key.clone(), + b64key, ); copy_headers.insert( String::from("X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key-MD5"), - md5key.clone(), + md5key, ); SseCustomerKey { - headers: headers, - copy_headers: copy_headers, + headers, + copy_headers, } } } @@ -110,7 +110,7 @@ impl SseKms { ); } - SseKms { headers: headers } + SseKms { headers } } } @@ -145,7 +145,13 @@ impl SseS3 { String::from("AES256"), ); - SseS3 { headers: headers } + SseS3 { headers } + } +} + +impl Default for SseS3 { + fn default() -> Self { + Self::new() } } diff --git a/src/s3/types.rs b/src/s3/types.rs index 820b01f..99fed2a 100644 --- a/src/s3/types.rs +++ b/src/s3/types.rs @@ -221,7 +221,7 @@ impl<'a> SelectRequest<'a> { } Ok(SelectRequest { - expr: expr, + expr, csv_input: Some(csv_input), json_input: None, parquet_input: None, @@ -245,7 +245,7 @@ impl<'a> SelectRequest<'a> { } Ok(SelectRequest { - expr: expr, + expr, csv_input: Some(csv_input), json_input: None, parquet_input: None, @@ -269,7 +269,7 @@ impl<'a> SelectRequest<'a> { } Ok(SelectRequest { - expr: expr, + expr, csv_input: None, json_input: Some(json_input), parquet_input: None, @@ -293,7 +293,7 @@ impl<'a> SelectRequest<'a> { } Ok(SelectRequest { - expr: expr, + expr, csv_input: None, json_input: None, parquet_input: Some(parquet_input), @@ -317,7 +317,7 @@ impl<'a> SelectRequest<'a> { } Ok(SelectRequest { - expr: expr, + expr, csv_input: None, json_input: None, parquet_input: Some(parquet_input), @@ -388,7 +388,7 @@ impl<'a> SelectRequest<'a> { data.push_str(""); } data.push_str(""); - } else if let Some(_) = &self.parquet_input { + } else if self.parquet_input.is_some() { data.push_str(""); } data.push_str(""); @@ -451,7 +451,7 @@ impl<'a> SelectRequest<'a> { } data.push_str(""); - return data; + data } } @@ -612,7 +612,7 @@ impl SseConfig { pub fn kms(kms_master_key_id: Option) -> SseConfig { SseConfig { sse_algorithm: String::from("aws:kms"), - kms_master_key_id: kms_master_key_id, + kms_master_key_id, } } @@ -631,7 +631,7 @@ impl SseConfig { data.push_str( "", ); - return data; + data } } @@ -661,7 +661,9 @@ impl Filter { prefix: match v.get_child("Prefix") { Some(p) => Some( p.get_text() - .ok_or(Error::XmlError(format!("text of tag not found")))? + .ok_or(Error::XmlError( + "text of tag not found".to_string(), + ))? .to_string(), ), None => None, @@ -672,7 +674,7 @@ impl Filter { for xml_node in &tags.children { let tag = xml_node .as_element() - .ok_or(Error::XmlError(format!(" element not found")))?; + .ok_or(Error::XmlError(" element not found".to_string()))?; map.insert(get_text(tag, "Key")?, get_text(tag, "Value")?); } Some(map) @@ -686,7 +688,9 @@ impl Filter { let prefix = match element.get_child("Prefix") { Some(v) => Some( v.get_text() - .ok_or(Error::XmlError(format!("text of tag not found")))? + .ok_or(Error::XmlError( + "text of tag not found".to_string(), + ))? .to_string(), ), None => None, @@ -701,9 +705,9 @@ impl Filter { }; Ok(Filter { - and_operator: and_operator, - prefix: prefix, - tag: tag, + and_operator, + prefix, + tag, }) } @@ -711,7 +715,7 @@ impl Filter { if self.and_operator.is_some() ^ self.prefix.is_some() ^ self.tag.is_some() { return Ok(()); } - return Err(Error::InvalidFilter); + Err(Error::InvalidFilter) } pub fn to_xml(&self) -> String { @@ -720,17 +724,17 @@ impl Filter { data.push_str(""); if self.and_operator.as_ref().unwrap().prefix.is_some() { data.push_str(""); - data.push_str(&self.and_operator.as_ref().unwrap().prefix.as_ref().unwrap()); + data.push_str(self.and_operator.as_ref().unwrap().prefix.as_ref().unwrap()); data.push_str(""); } if self.and_operator.as_ref().unwrap().tags.is_some() { for (key, value) in self.and_operator.as_ref().unwrap().tags.as_ref().unwrap() { data.push_str(""); data.push_str(""); - data.push_str(&key); + data.push_str(key); data.push_str(""); data.push_str(""); - data.push_str(&value); + data.push_str(value); data.push_str(""); data.push_str(""); } @@ -739,7 +743,7 @@ impl Filter { } if self.prefix.is_some() { data.push_str(""); - data.push_str(&self.prefix.as_ref().unwrap()); + data.push_str(self.prefix.as_ref().unwrap()); data.push_str(""); } if self.tag.is_some() { @@ -754,7 +758,7 @@ impl Filter { } data.push_str(""); - return data; + data } } @@ -812,7 +816,7 @@ impl LifecycleRule { filter: Filter::from_xml( element .get_child("Filter") - .ok_or(Error::XmlError(format!(" tag not found")))?, + .ok_or(Error::XmlError(" tag not found".to_string()))?, )?, id: get_default_text(element, "ID"), noncurrent_version_expiration_noncurrent_days: match element @@ -906,14 +910,15 @@ impl LifecycleConfig { if let Some(v) = root.get_child("Rule") { for rule in &v.children { - config.rules.push(LifecycleRule::from_xml( - rule.as_element() - .ok_or(Error::XmlError(format!(" tag not found")))?, - )?); + config + .rules + .push(LifecycleRule::from_xml(rule.as_element().ok_or( + Error::XmlError(" tag not found".to_string()), + )?)?); } } - return Ok(config); + Ok(config) } pub fn validate(&self) -> Result<(), Error> { @@ -1008,8 +1013,7 @@ impl LifecycleConfig { if rule.noncurrent_version_transition_storage_class.is_some() { data.push_str(""); data.push_str( - &rule - .noncurrent_version_transition_storage_class + rule.noncurrent_version_transition_storage_class .as_ref() .unwrap(), ); @@ -1043,7 +1047,7 @@ impl LifecycleConfig { } if rule.transition_storage_class.is_some() { data.push_str(""); - data.push_str(&rule.transition_storage_class.as_ref().unwrap()); + data.push_str(rule.transition_storage_class.as_ref().unwrap()); data.push_str(""); } data.push_str(""); @@ -1054,7 +1058,7 @@ impl LifecycleConfig { data.push_str(""); - return data; + data } } @@ -1070,15 +1074,12 @@ fn parse_common_notification_config( Error, > { let mut events = Vec::new(); - loop { - match element.take_child("Event") { - Some(v) => events.push( - v.get_text() - .ok_or(Error::XmlError(format!("text of tag not found")))? - .to_string(), - ), - _ => break, - } + while let Some(v) = element.take_child("Event") { + events.push( + v.get_text() + .ok_or(Error::XmlError("text of tag not found".to_string()))? + .to_string(), + ); } let id = get_option_text(element, "Id"); @@ -1089,17 +1090,17 @@ fn parse_common_notification_config( let mut suffix = None; let rules = filter .get_child("S3Key") - .ok_or(Error::XmlError(format!(" tag not found")))?; + .ok_or(Error::XmlError(" tag not found".to_string()))?; for rule in &rules.children { let v = rule .as_element() - .ok_or(Error::XmlError(format!(" tag not found")))?; + .ok_or(Error::XmlError(" tag not found".to_string()))?; let name = get_text(v, "Name")?; let value = get_text(v, "Value")?; if PrefixFilterRule::NAME == name { - prefix = Some(PrefixFilterRule { value: value }); + prefix = Some(PrefixFilterRule { value }); } else { - suffix = Some(SuffixFilterRule { value: value }); + suffix = Some(SuffixFilterRule { value }); } } (prefix, suffix) @@ -1120,13 +1121,13 @@ fn to_xml_common_notification_config( for event in events { data.push_str(""); - data.push_str(&event); + data.push_str(event); data.push_str(""); } if let Some(v) = id { data.push_str(""); - data.push_str(&v); + data.push_str(v); data.push_str(""); } @@ -1150,7 +1151,7 @@ fn to_xml_common_notification_config( data.push_str(""); } - return data; + data } #[derive(Clone, Debug)] @@ -1185,20 +1186,20 @@ impl CloudFuncConfig { let (events, id, prefix_filter_rule, suffix_filter_rule) = parse_common_notification_config(element)?; Ok(CloudFuncConfig { - events: events, - id: id, - prefix_filter_rule: prefix_filter_rule, - suffix_filter_rule: suffix_filter_rule, + events, + id, + prefix_filter_rule, + suffix_filter_rule, cloud_func: get_text(element, "CloudFunction")?, }) } pub fn validate(&self) -> Result<(), Error> { - if self.events.len() != 0 && self.cloud_func != "" { + if !self.events.is_empty() && !self.cloud_func.is_empty() { return Ok(()); } - return Err(Error::InvalidFilter); + Err(Error::InvalidFilter) } pub fn to_xml(&self) -> String { @@ -1217,7 +1218,7 @@ impl CloudFuncConfig { data.push_str(""); - return data; + data } } @@ -1235,20 +1236,20 @@ impl QueueConfig { let (events, id, prefix_filter_rule, suffix_filter_rule) = parse_common_notification_config(element)?; Ok(QueueConfig { - events: events, - id: id, - prefix_filter_rule: prefix_filter_rule, - suffix_filter_rule: suffix_filter_rule, + events, + id, + prefix_filter_rule, + suffix_filter_rule, queue: get_text(element, "Queue")?, }) } pub fn validate(&self) -> Result<(), Error> { - if self.events.len() != 0 && self.queue != "" { + if !self.events.is_empty() && !self.queue.is_empty() { return Ok(()); } - return Err(Error::InvalidFilter); + Err(Error::InvalidFilter) } pub fn to_xml(&self) -> String { @@ -1267,7 +1268,7 @@ impl QueueConfig { data.push_str(""); - return data; + data } } @@ -1285,20 +1286,20 @@ impl TopicConfig { let (events, id, prefix_filter_rule, suffix_filter_rule) = parse_common_notification_config(element)?; Ok(TopicConfig { - events: events, - id: id, - prefix_filter_rule: prefix_filter_rule, - suffix_filter_rule: suffix_filter_rule, + events, + id, + prefix_filter_rule, + suffix_filter_rule, topic: get_text(element, "Topic")?, }) } pub fn validate(&self) -> Result<(), Error> { - if self.events.len() != 0 && self.topic != "" { + if !self.events.is_empty() && !self.topic.is_empty() { return Ok(()); } - return Err(Error::InvalidFilter); + Err(Error::InvalidFilter) } pub fn to_xml(&self) -> String { @@ -1317,7 +1318,7 @@ impl TopicConfig { data.push_str(""); - return data; + data } } @@ -1337,39 +1338,30 @@ impl NotificationConfig { }; let mut cloud_func_config_list = Vec::new(); - loop { - match root.take_child("CloudFunctionConfiguration") { - Some(mut v) => cloud_func_config_list.push(CloudFuncConfig::from_xml(&mut v)?), - _ => break, - } + while let Some(mut v) = root.take_child("CloudFunctionConfiguration") { + cloud_func_config_list.push(CloudFuncConfig::from_xml(&mut v)?); } - if cloud_func_config_list.len() != 0 { + if !cloud_func_config_list.is_empty() { config.cloud_func_config_list = Some(cloud_func_config_list); } let mut queue_config_list = Vec::new(); - loop { - match root.take_child("QueueConfiguration") { - Some(mut v) => queue_config_list.push(QueueConfig::from_xml(&mut v)?), - _ => break, - } + while let Some(mut v) = root.take_child("QueueConfiguration") { + queue_config_list.push(QueueConfig::from_xml(&mut v)?); } - if queue_config_list.len() != 0 { + if !queue_config_list.is_empty() { config.queue_config_list = Some(queue_config_list); } let mut topic_config_list = Vec::new(); - loop { - match root.take_child("TopicConfiguration") { - Some(mut v) => topic_config_list.push(TopicConfig::from_xml(&mut v)?), - _ => break, - } + while let Some(mut v) = root.take_child("TopicConfiguration") { + topic_config_list.push(TopicConfig::from_xml(&mut v)?); } - if topic_config_list.len() != 0 { + if !topic_config_list.is_empty() { config.topic_config_list = Some(topic_config_list); } - return Ok(config); + Ok(config) } pub fn validate(&self) -> Result<(), Error> { @@ -1416,7 +1408,7 @@ impl NotificationConfig { } data.push_str(""); - return data; + data } } @@ -1433,6 +1425,12 @@ impl AccessControlTranslation { } } +impl Default for AccessControlTranslation { + fn default() -> Self { + Self::new() + } +} + #[derive(Clone, Debug)] pub struct EncryptionConfig { pub replica_kms_key_id: Option, @@ -1448,7 +1446,7 @@ impl Metrics { pub fn new(status: bool) -> Metrics { Metrics { event_threshold_minutes: Some(15), - status: status, + status, } } } @@ -1463,7 +1461,7 @@ impl ReplicationTime { pub fn new(status: bool) -> ReplicationTime { ReplicationTime { time_minutes: Some(15), - status: status, + status, } } } @@ -1490,17 +1488,16 @@ impl Destination { _ => None, }, account: get_option_text(element, "Account"), - encryption_config: match element.get_child("EncryptionConfiguration") { - Some(v) => Some(EncryptionConfig { + encryption_config: element.get_child("EncryptionConfiguration").map(|v| { + EncryptionConfig { replica_kms_key_id: get_option_text(v, "ReplicaKmsKeyID"), - }), - _ => None, - }, + } + }), metrics: match element.get_child("Metrics") { Some(v) => Some(Metrics { event_threshold_minutes: match get_option_text( v.get_child("EventThreshold") - .ok_or(Error::XmlError(format!(" tag not found")))?, + .ok_or(Error::XmlError(" tag not found".to_string()))?, "Minutes", ) { Some(v) => Some(v.parse::()?), @@ -1539,7 +1536,7 @@ impl Destination { if let Some(v) = &self.account { data.push_str(""); - data.push_str(&v); + data.push_str(v); data.push_str(""); } @@ -1547,7 +1544,7 @@ impl Destination { data.push_str(""); if let Some(v) = &c.replica_kms_key_id { data.push_str(""); - data.push_str(&v); + data.push_str(v); data.push_str(""); } data.push_str(""); @@ -1593,13 +1590,13 @@ impl Destination { if let Some(v) = &self.storage_class { data.push_str(""); - data.push_str(&v); + data.push_str(v); data.push_str(""); } data.push_str(""); - return data; + data } } @@ -1628,7 +1625,7 @@ impl ReplicationRule { destination: Destination::from_xml( element .get_child("Destination") - .ok_or(Error::XmlError(format!(" tag not found")))?, + .ok_or(Error::XmlError(" tag not found".to_string()))?, )?, delete_marker_replication_status: match element.get_child("DeleteMarkerReplication") { Some(v) => Some(get_text(v, "Status")? == "Enabled"), @@ -1699,13 +1696,13 @@ impl ReplicationRule { if let Some(v) = &self.id { data.push_str(""); - data.push_str(&v); + data.push_str(v); data.push_str(""); } if let Some(v) = &self.prefix { data.push_str(""); - data.push_str(&v); + data.push_str(v); data.push_str(""); } @@ -1748,7 +1745,7 @@ impl ReplicationRule { }); data.push_str(""); - return data; + data } } @@ -1767,14 +1764,15 @@ impl ReplicationConfig { if let Some(v) = root.get_child("Rule") { for rule in &v.children { - config.rules.push(ReplicationRule::from_xml( - rule.as_element() - .ok_or(Error::XmlError(format!(" tag not found")))?, - )?); + config + .rules + .push(ReplicationRule::from_xml(rule.as_element().ok_or( + Error::XmlError(" tag not found".to_string()), + )?)?); } } - return Ok(config); + Ok(config) } pub fn to_xml(&self) -> String { @@ -1782,7 +1780,7 @@ impl ReplicationConfig { if let Some(v) = &self.role { data.push_str(""); - data.push_str(&v); + data.push_str(v); data.push_str(""); } @@ -1791,7 +1789,7 @@ impl ReplicationConfig { } data.push_str(""); - return data; + data } } @@ -1816,9 +1814,9 @@ impl ObjectLockConfig { }); } - Err(Error::InvalidObjectLockConfig(format!( - "only one days or years must be set" - ))) + Err(Error::InvalidObjectLockConfig( + "only one days or years must be set".to_string(), + )) } pub fn from_xml(root: &Element) -> Result { @@ -1829,9 +1827,9 @@ impl ObjectLockConfig { }; if let Some(r) = root.get_child("Rule") { - let default_retention = r - .get_child("DefaultRetention") - .ok_or(Error::XmlError(format!(" tag not found")))?; + let default_retention = r.get_child("DefaultRetention").ok_or(Error::XmlError( + " tag not found".to_string(), + ))?; config.retention_mode = Some(RetentionMode::parse(&get_text(default_retention, "Mode")?)?); @@ -1844,7 +1842,7 @@ impl ObjectLockConfig { } } - return Ok(config); + Ok(config) } pub fn to_xml(&self) -> String { @@ -1869,6 +1867,6 @@ impl ObjectLockConfig { } data.push_str(""); - return data; + data } } diff --git a/src/s3/utils.rs b/src/s3/utils.rs index 323dc71..4e3840b 100644 --- a/src/s3/utils.rs +++ b/src/s3/utils.rs @@ -14,7 +14,8 @@ // limitations under the License. use crate::s3::error::Error; -pub use base64::encode as b64encode; +use base64::engine::general_purpose::STANDARD as BASE64; +use base64::engine::Engine as _; use byteorder::{BigEndian, ReadBytesExt}; use chrono::{DateTime, Datelike, NaiveDateTime, ParseError, Utc}; use crc::{Crc, CRC_32_ISO_HDLC}; @@ -32,6 +33,10 @@ pub type UtcTime = DateTime; pub type Multimap = MultiMap; +pub fn b64encode>(input: T) -> String { + BASE64.encode(input) +} + pub fn merge(m1: &mut Multimap, m2: &Multimap) { for (key, values) in m2.iter_all() { for value in values { @@ -51,7 +56,7 @@ pub fn uint32(mut data: &[u8]) -> Result { pub fn sha256_hash(data: &[u8]) -> String { let mut hasher = Sha256::new(); hasher.update(data); - return format!("{:x}", hasher.finalize()); + format!("{:x}", hasher.finalize()) } pub fn md5sum_hash(data: &[u8]) -> String { @@ -90,7 +95,7 @@ pub fn to_http_header_value(time: UtcTime) -> String { 12 => "Dec", _ => "", }, - time.format("%Y %H:%M:%S").to_string() + time.format("%Y %H:%M:%S") ) } @@ -99,7 +104,7 @@ pub fn to_iso8601utc(time: UtcTime) -> String { } pub fn from_iso8601utc(s: &str) -> Result { - Ok(DateTime::::from_utc( + Ok(DateTime::::from_naive_utc_and_offset( match NaiveDateTime::parse_from_str(s, "%Y-%m-%dT%H:%M:%S.%3fZ") { Ok(d) => d, _ => NaiveDateTime::parse_from_str(s, "%Y-%m-%dT%H:%M:%SZ")?, @@ -109,7 +114,7 @@ pub fn from_iso8601utc(s: &str) -> Result { } pub fn from_http_header_value(s: &str) -> Result { - Ok(DateTime::::from_utc( + Ok(DateTime::::from_naive_utc_and_offset( NaiveDateTime::parse_from_str(s, "%a, %d %b %Y %H:%M:%S GMT")?, Utc, )) @@ -126,7 +131,7 @@ pub fn to_http_headers(map: &Multimap) -> Vec { headers.push(s); } } - return headers; + headers } pub fn to_query_string(map: &Multimap) -> String { @@ -134,14 +139,14 @@ pub fn to_query_string(map: &Multimap) -> String { for (key, values) in map.iter_all() { for value in values { if !query.is_empty() { - query.push_str("&"); + query.push('&'); } query.push_str(&urlencode(key)); - query.push_str("="); + query.push('='); query.push_str(&urlencode(value)); } } - return query; + query } pub fn get_canonical_query_string(map: &Multimap) -> String { @@ -157,10 +162,10 @@ pub fn get_canonical_query_string(map: &Multimap) -> String { Some(values) => { for value in values { if !query.is_empty() { - query.push_str("&"); + query.push('&'); } query.push_str(&urlencode(key.as_str())); - query.push_str("="); + query.push('='); query.push_str(&urlencode(value)); } } @@ -168,7 +173,7 @@ pub fn get_canonical_query_string(map: &Multimap) -> String { }; } - return query; + query } pub fn get_canonical_headers(map: &Multimap) -> (String, String) { @@ -189,7 +194,7 @@ pub fn get_canonical_headers(map: &Multimap) -> (String, String) { let mut value = String::new(); for v in vs { if !value.is_empty() { - value.push_str(","); + value.push(','); } let s: String = MULTI_SPACE_REGEX.replace_all(&v, " ").to_string(); value.push_str(&s); @@ -202,20 +207,20 @@ pub fn get_canonical_headers(map: &Multimap) -> (String, String) { let mut add_delim = false; for (key, value) in &btmap { if add_delim { - signed_headers.push_str(";"); - canonical_headers.push_str("\n"); + signed_headers.push(';'); + canonical_headers.push('\n'); } signed_headers.push_str(key); canonical_headers.push_str(key); - canonical_headers.push_str(":"); + canonical_headers.push(':'); canonical_headers.push_str(value); add_delim = true; } - return (signed_headers, canonical_headers); + (signed_headers, canonical_headers) } pub fn check_bucket_name(bucket_name: &str, strict: bool) -> Result<(), Error> { @@ -269,7 +274,7 @@ pub fn check_bucket_name(bucket_name: &str, strict: bool) -> Result<(), Error> { ))); } - return Ok(()); + Ok(()) } pub fn get_text(element: &Element, tag: &str) -> Result { diff --git a/tests/private.key b/tests/private.key index ffe1b17..005167e 100644 --- a/tests/private.key +++ b/tests/private.key @@ -1,5 +1,5 @@ -----BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgs92/22T2vIGJCIHR -6KL78f37XJXTJCpIlyVozmEo9iahRANCAATWlbZ1mHD8YeMKa2kM7E7hptGcl+6h -mmq4ugD3bbJCh22wLTxHobqadlCnq976H91Z2yM2cXmZLByz8Epgg/9w +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgkZrDqi6YL+RS5xEy +YLMVrCDC9r/F39UYKDPAIS41ulGhRANCAAQgpenErxeS4XVDweO41kcBzeS911/B +cLEDTGmuZF0ZeOHF6JJYtBEMXgxbglUIUPmE+3L21u/6fqR5aztM8GHy -----END PRIVATE KEY----- diff --git a/tests/public.crt b/tests/public.crt index 9d49164..335731a 100644 --- a/tests/public.crt +++ b/tests/public.crt @@ -1,13 +1,12 @@ -----BEGIN CERTIFICATE----- -MIIB5zCCAY2gAwIBAgIQGDcDELutI2jM7kTgfeESPzAKBggqhkjOPQQDAjA7MRww -GgYDVQQKExNDZXJ0Z2VuIERldmVsb3BtZW50MRswGQYDVQQLDBJoYXJzaGFAbmFu -byAobmFubykwHhcNMjIwODIzMDgxMDQwWhcNMjMwODIzMDgxMDQwWjA7MRwwGgYD -VQQKExNDZXJ0Z2VuIERldmVsb3BtZW50MRswGQYDVQQLDBJoYXJzaGFAbmFubyAo -bmFubykwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATWlbZ1mHD8YeMKa2kM7E7h -ptGcl+6hmmq4ugD3bbJCh22wLTxHobqadlCnq976H91Z2yM2cXmZLByz8Epgg/9w -o3MwcTAOBgNVHQ8BAf8EBAMCAqQwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0T -AQH/BAUwAwEB/zAdBgNVHQ4EFgQUE9fw8e+S5H5lOzreN8FFcBP3r2gwGgYDVR0R -BBMwEYIJbG9jYWxob3N0hwR/AAABMAoGCCqGSM49BAMCA0gAMEUCIBHcFxnYVTIu -KI9AcywtvtFIINknZ0dSVrR0nzUMSOskAiEAqbj+BqVogZzO8GC+1l71K/R+j4yP -NOwfeX1Aq+3fDQ0= +MIIB1TCCAXygAwIBAgIRAP0ihBYxR23zNUlka9xA4TYwCgYIKoZIzj0EAwIwMTEc +MBoGA1UEChMTQ2VydGdlbiBEZXZlbG9wbWVudDERMA8GA1UECwwIYmFsYUBmMzgw +IBcNMjMwODMwMTIzMTQzWhgPMjEyMzA4MDYxMjMxNDNaMDExHDAaBgNVBAoTE0Nl +cnRnZW4gRGV2ZWxvcG1lbnQxETAPBgNVBAsMCGJhbGFAZjM4MFkwEwYHKoZIzj0C +AQYIKoZIzj0DAQcDQgAEIKXpxK8XkuF1Q8HjuNZHAc3kvddfwXCxA0xprmRdGXjh +xeiSWLQRDF4MW4JVCFD5hPty9tbv+n6keWs7TPBh8qNzMHEwDgYDVR0PAQH/BAQD +AgKkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFOI5oRDgCm3lEefkHkKutkW6dzMyMBoGA1UdEQQTMBGCCWxvY2FsaG9zdIcE +fwAAATAKBggqhkjOPQQDAgNHADBEAiAN77OMdOC0OW1eubI6RygpWxv1SOtKqtRJ +CFbdqTLYKgIgVe7mPBqBECShFFjcGvSvRl2ev0f19EN37BEj9E+ZZXI= -----END CERTIFICATE----- diff --git a/tests/tests.rs b/tests/tests.rs index 603c480..05f210d 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -41,7 +41,7 @@ struct RandReader { impl RandReader { fn new(size: usize) -> RandReader { - RandReader { size: size } + RandReader { size } } } @@ -99,12 +99,12 @@ impl<'a> ClientTest<'_> { client.ssl_cert_file = ssl_cert_file.to_string(); ClientTest { - base_url: base_url, - access_key: access_key, - secret_key: secret_key, - ignore_cert_check: ignore_cert_check, - ssl_cert_file: ssl_cert_file, - client: client, + base_url, + access_key, + secret_key, + ignore_cert_check, + ssl_cert_file, + client, test_bucket: rand_bucket_name(), } } @@ -134,7 +134,7 @@ impl<'a> ClientTest<'_> { .bucket_exists(&BucketExistsArgs::new(&bucket_name).unwrap()) .await .unwrap(); - assert_eq!(exists, true); + assert!(exists); self.client .remove_bucket(&RemoveBucketArgs::new(&bucket_name).unwrap()) .await @@ -149,7 +149,7 @@ impl<'a> ClientTest<'_> { for b in names.iter() { self.client - .make_bucket(&MakeBucketArgs::new(&b).unwrap()) + .make_bucket(&MakeBucketArgs::new(b).unwrap()) .await .unwrap(); } @@ -169,7 +169,7 @@ impl<'a> ClientTest<'_> { for b in names.iter() { self.client - .remove_bucket(&RemoveBucketArgs::new(&b).unwrap()) + .remove_bucket(&RemoveBucketArgs::new(b).unwrap()) .await .unwrap(); } @@ -268,7 +268,7 @@ impl<'a> ClientTest<'_> { let mut hasher = Sha256::new(); let mut file = fs::File::open(filename).unwrap(); io::copy(&mut file, &mut hasher).unwrap(); - return format!("{:x}", hasher.finalize()); + format!("{:x}", hasher.finalize()) } async fn upload_download_object(&self) { @@ -279,7 +279,7 @@ impl<'a> ClientTest<'_> { file.sync_all().unwrap(); self.client .upload_object( - &mut UploadObjectArgs::new(&self.test_bucket, &object_name, &object_name).unwrap(), + &UploadObjectArgs::new(&self.test_bucket, &object_name, &object_name).unwrap(), ) .await .unwrap(); @@ -291,10 +291,7 @@ impl<'a> ClientTest<'_> { ) .await .unwrap(); - assert_eq!( - ClientTest::get_hash(&object_name) == ClientTest::get_hash(&filename), - true - ); + assert!(ClientTest::get_hash(&object_name) == ClientTest::get_hash(&filename)); fs::remove_file(&object_name).unwrap(); fs::remove_file(&filename).unwrap(); @@ -316,7 +313,7 @@ impl<'a> ClientTest<'_> { file.sync_all().unwrap(); self.client .upload_object( - &mut UploadObjectArgs::new(&self.test_bucket, &object_name, &object_name).unwrap(), + &UploadObjectArgs::new(&self.test_bucket, &object_name, &object_name).unwrap(), ) .await .unwrap(); @@ -328,10 +325,7 @@ impl<'a> ClientTest<'_> { ) .await .unwrap(); - assert_eq!( - ClientTest::get_hash(&object_name) == ClientTest::get_hash(&filename), - true - ); + assert!(ClientTest::get_hash(&object_name) == ClientTest::get_hash(&filename)); fs::remove_file(&object_name).unwrap(); fs::remove_file(&filename).unwrap(); @@ -376,7 +370,7 @@ impl<'a> ClientTest<'_> { let mut objects: Vec = Vec::new(); for name in names.iter() { objects.push(DeleteObject { - name: &name, + name, version_id: None, }); } @@ -423,9 +417,9 @@ impl<'a> ClientTest<'_> { self.client .list_objects( - &mut ListObjectsArgs::new(&self.test_bucket, &|items| { + &ListObjectsArgs::new(&self.test_bucket, &|items| { for item in items.iter() { - assert_eq!(names.contains(&item.name), true); + assert!(names.contains(&item.name)); } true }) @@ -437,7 +431,7 @@ impl<'a> ClientTest<'_> { let mut objects: Vec = Vec::new(); for name in names.iter() { objects.push(DeleteObject { - name: &name, + name, version_id: None, }); } @@ -557,11 +551,11 @@ impl<'a> ClientTest<'_> { } } sender.send(false).unwrap(); - return false; + false }; let args = &ListenBucketNotificationArgs::new(&test_bucket, &event_fn).unwrap(); - client.listen_bucket_notification(&args).await.unwrap(); + client.listen_bucket_notification(args).await.unwrap(); }; let spawned_task = task::spawn(listen_task()); @@ -588,7 +582,7 @@ impl<'a> ClientTest<'_> { .unwrap(); spawned_task.await; - assert_eq!(receiver.recv().await.unwrap(), true); + assert!(receiver.recv().await.unwrap()); } async fn copy_object(&self) { @@ -732,18 +726,12 @@ impl<'a> ClientTest<'_> { .await .unwrap(); assert_eq!(resp.config.queue_config_list.as_ref().unwrap().len(), 1); - assert_eq!( - resp.config.queue_config_list.as_ref().unwrap()[0] - .events - .contains(&String::from("s3:ObjectCreated:Put")), - true - ); - assert_eq!( - resp.config.queue_config_list.as_ref().unwrap()[0] - .events - .contains(&String::from("s3:ObjectCreated:Copy")), - true - ); + assert!(resp.config.queue_config_list.as_ref().unwrap()[0] + .events + .contains(&String::from("s3:ObjectCreated:Put"))); + assert!(resp.config.queue_config_list.as_ref().unwrap()[0] + .events + .contains(&String::from("s3:ObjectCreated:Copy"))); assert_eq!( resp.config.queue_config_list.as_ref().unwrap()[0] .prefix_filter_rule @@ -775,7 +763,7 @@ impl<'a> ClientTest<'_> { .get_bucket_notification(&GetBucketNotificationArgs::new(&bucket_name).unwrap()) .await .unwrap(); - assert_eq!(resp.config.queue_config_list.is_none(), true); + assert!(resp.config.queue_config_list.is_none()); self.client .remove_bucket(&RemoveBucketArgs::new(&bucket_name).unwrap()) @@ -824,7 +812,7 @@ impl<'a> ClientTest<'_> { .get_bucket_policy(&GetBucketPolicyArgs::new(&bucket_name).unwrap()) .await .unwrap(); - assert_eq!(resp.config.is_empty(), false); + assert!(!resp.config.is_empty()); self.client .delete_bucket_policy(&DeleteBucketPolicyArgs::new(&bucket_name).unwrap()) @@ -866,10 +854,7 @@ impl<'a> ClientTest<'_> { .get_bucket_tags(&GetBucketTagsArgs::new(&bucket_name).unwrap()) .await .unwrap(); - assert_eq!( - resp.tags.len() == tags.len() && resp.tags.keys().all(|k| tags.contains_key(k)), - true - ); + assert!(resp.tags.len() == tags.len() && resp.tags.keys().all(|k| tags.contains_key(k))); self.client .delete_bucket_tags(&DeleteBucketTagsArgs::new(&bucket_name).unwrap()) @@ -881,7 +866,7 @@ impl<'a> ClientTest<'_> { .get_bucket_tags(&GetBucketTagsArgs::new(&bucket_name).unwrap()) .await .unwrap(); - assert_eq!(resp.tags.is_empty(), true); + assert!(resp.tags.is_empty()); self.client .remove_bucket(&RemoveBucketArgs::new(&bucket_name).unwrap()) @@ -912,19 +897,13 @@ impl<'a> ClientTest<'_> { .get_object_lock_config(&GetObjectLockConfigArgs::new(&bucket_name).unwrap()) .await .unwrap(); - assert_eq!( - match resp.config.retention_mode { - Some(r) => match r { - RetentionMode::GOVERNANCE => true, - _ => false, - }, - _ => false, - }, - true - ); + assert!(match resp.config.retention_mode { + Some(r) => matches!(r, RetentionMode::GOVERNANCE), + _ => false, + }); - assert_eq!(resp.config.retention_duration_days == Some(7), true); - assert_eq!(resp.config.retention_duration_years.is_none(), true); + assert!(resp.config.retention_duration_days == Some(7)); + assert!(resp.config.retention_duration_years.is_none()); self.client .delete_object_lock_config(&DeleteObjectLockConfigArgs::new(&bucket_name).unwrap()) @@ -936,7 +915,7 @@ impl<'a> ClientTest<'_> { .get_object_lock_config(&GetObjectLockConfigArgs::new(&bucket_name).unwrap()) .await .unwrap(); - assert_eq!(resp.config.retention_mode.is_none(), true); + assert!(resp.config.retention_mode.is_none()); self.client .remove_bucket(&RemoveBucketArgs::new(&bucket_name).unwrap()) @@ -979,10 +958,7 @@ impl<'a> ClientTest<'_> { .get_object_tags(&GetObjectTagsArgs::new(&self.test_bucket, &object_name).unwrap()) .await .unwrap(); - assert_eq!( - resp.tags.len() == tags.len() && resp.tags.keys().all(|k| tags.contains_key(k)), - true - ); + assert!(resp.tags.len() == tags.len() && resp.tags.keys().all(|k| tags.contains_key(k))); self.client .delete_object_tags( @@ -996,7 +972,7 @@ impl<'a> ClientTest<'_> { .get_object_tags(&GetObjectTagsArgs::new(&self.test_bucket, &object_name).unwrap()) .await .unwrap(); - assert_eq!(resp.tags.is_empty(), true); + assert!(resp.tags.is_empty()); self.client .remove_object(&RemoveObjectArgs::new(&self.test_bucket, &object_name).unwrap()) @@ -1022,13 +998,10 @@ impl<'a> ClientTest<'_> { .get_bucket_versioning(&GetBucketVersioningArgs::new(&bucket_name).unwrap()) .await .unwrap(); - assert_eq!( - match resp.status { - Some(v) => v, - _ => false, - }, - true - ); + assert!(match resp.status { + Some(v) => v, + _ => false, + }); self.client .set_bucket_versioning(&SetBucketVersioningArgs::new(&bucket_name, false).unwrap()) @@ -1040,12 +1013,11 @@ impl<'a> ClientTest<'_> { .get_bucket_versioning(&GetBucketVersioningArgs::new(&bucket_name).unwrap()) .await .unwrap(); - assert_eq!( - match resp.status { + assert!( + !(match resp.status { Some(v) => v, _ => false, - }, - false + }) ); self.client @@ -1091,23 +1063,14 @@ impl<'a> ClientTest<'_> { .get_object_retention(&GetObjectRetentionArgs::new(&bucket_name, &object_name).unwrap()) .await .unwrap(); - assert_eq!( - match resp.retention_mode { - Some(v) => match v { - RetentionMode::GOVERNANCE => true, - _ => false, - }, - _ => false, - }, - true - ); - assert_eq!( - match resp.retain_until_date { - Some(v) => to_iso8601utc(v) == to_iso8601utc(retain_until_date), - _ => false, - }, - true, - ); + assert!(match resp.retention_mode { + Some(v) => matches!(v, RetentionMode::GOVERNANCE), + _ => false, + }); + assert!(match resp.retain_until_date { + Some(v) => to_iso8601utc(v) == to_iso8601utc(retain_until_date), + _ => false, + },); let mut args = SetObjectRetentionArgs::new(&bucket_name, &object_name).unwrap(); args.bypass_governance_mode = true; @@ -1118,8 +1081,8 @@ impl<'a> ClientTest<'_> { .get_object_retention(&GetObjectRetentionArgs::new(&bucket_name, &object_name).unwrap()) .await .unwrap(); - assert_eq!(resp.retention_mode.is_none(), true); - assert_eq!(resp.retain_until_date.is_none(), true); + assert!(resp.retention_mode.is_none()); + assert!(resp.retain_until_date.is_none()); let mut args = RemoveObjectArgs::new(&bucket_name, &object_name).unwrap(); let version_id = obj_resp.version_id.unwrap().clone(); @@ -1142,7 +1105,7 @@ impl<'a> ClientTest<'_> { ) .await .unwrap(); - assert_eq!(resp.url.contains("X-Amz-Signature="), true); + assert!(resp.url.contains("X-Amz-Signature=")); } async fn get_presigned_post_form_data(&self) { @@ -1152,7 +1115,7 @@ impl<'a> ClientTest<'_> { let mut policy = PostPolicy::new(&self.test_bucket, &expiration).unwrap(); policy.add_equals_condition("key", &object_name).unwrap(); policy - .add_content_length_range_condition(1 * 1024 * 1024, 4 * 1024 * 1024) + .add_content_length_range_condition(1024 * 1024, 4 * 1024 * 1024) .unwrap(); let form_data = self @@ -1160,8 +1123,8 @@ impl<'a> ClientTest<'_> { .get_presigned_post_form_data(&policy) .await .unwrap(); - assert_eq!(form_data.contains_key("x-amz-signature"), true); - assert_eq!(form_data.contains_key("policy"), true); + assert!(form_data.contains_key("x-amz-signature")); + assert!(form_data.contains_key("policy")); } }