Skip to content

Commit 16cb0d4

Browse files
committed
update code review
1 parent 7a4de94 commit 16cb0d4

File tree

4 files changed

+52
-25
lines changed

4 files changed

+52
-25
lines changed

examples/bucket_versioning.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
mod common;
1717

1818
use crate::common::{create_bucket_if_not_exists, create_client_on_play};
19+
use minio::s3::builders::VersioningStatus;
1920
use minio::s3::response::{GetBucketVersioningResponse, SetBucketVersioningResponse};
2021
use minio::s3::types::S3Api;
2122
use minio::s3::Client;
@@ -38,7 +39,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
3839

3940
let _resp: SetBucketVersioningResponse = client
4041
.set_bucket_versioning(bucket_name)
41-
.status(true)
42+
.versioning_status(VersioningStatus::Enabled)
4243
.send()
4344
.await?;
4445

@@ -53,7 +54,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
5354

5455
let _resp: SetBucketVersioningResponse = client
5556
.set_bucket_versioning(bucket_name)
56-
.status(false)
57+
.versioning_status(VersioningStatus::Suspended)
5758
.send()
5859
.await?;
5960

src/s3/builders/set_bucket_versioning.rs

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,27 @@ use crate::s3::utils::{check_bucket_name, Multimap};
2121
use crate::s3::Client;
2222
use bytes::Bytes;
2323
use http::Method;
24+
use std::fmt;
25+
26+
#[derive(Clone, Debug, Default, PartialEq)]
27+
pub enum VersioningStatus {
28+
/// **Enable** object versioning in given bucket.
29+
Enabled,
30+
/// **Suspend** object versioning in given bucket.
31+
Suspended,
32+
#[default]
33+
None,
34+
}
35+
36+
impl fmt::Display for VersioningStatus {
37+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
38+
match self {
39+
VersioningStatus::Enabled => write!(f, "Enabled"),
40+
VersioningStatus::Suspended => write!(f, "Suspended"),
41+
VersioningStatus::None => write!(f, "None"),
42+
}
43+
}
44+
}
2445

2546
/// Argument builder for [set_bucket_encryption()](Client::set_bucket_encryption) API
2647
#[derive(Clone, Debug, Default)]
@@ -32,7 +53,7 @@ pub struct SetBucketVersioning {
3253
pub(crate) region: Option<String>,
3354
pub(crate) bucket: String,
3455

35-
pub(crate) status: bool,
56+
pub(crate) status: VersioningStatus,
3657
pub(crate) mfa_delete: Option<bool>,
3758
}
3859

@@ -63,7 +84,7 @@ impl SetBucketVersioning {
6384
self
6485
}
6586

66-
pub fn status(mut self, status: bool) -> Self {
87+
pub fn versioning_status(mut self, status: VersioningStatus) -> Self {
6788
self.status = status;
6889
self
6990
}
@@ -97,21 +118,21 @@ impl ToS3Request for SetBucketVersioning {
97118

98119
query_params.insert("versioning".into(), String::new());
99120

100-
let mfa_delete = self
101-
.mfa_delete
102-
.map(|v| {
103-
format!(
104-
"<MFADelete>{}</MFADelete>",
105-
if v { "Enabled" } else { "Disabled" }
106-
)
107-
})
108-
.unwrap_or_default();
121+
let mut data = "<VersioningConfiguration>".to_string();
122+
123+
if let Some(v) = self.mfa_delete {
124+
data.push_str("<MFADelete>");
125+
data.push_str(if v { "Enabled" } else { "Disabled" });
126+
data.push_str("</MFADelete>");
127+
}
128+
129+
match self.status {
130+
VersioningStatus::Enabled => data.push_str("<Status>Enabled</Status>"),
131+
VersioningStatus::Suspended => data.push_str("<Status>Suspended</Status>"),
132+
VersioningStatus::None => {}
133+
}
109134

110-
let data: String = format!(
111-
"<VersioningConfiguration><Status>{}</Status>{}</VersioningConfiguration>",
112-
if self.status { "Enabled" } else { "Suspended" },
113-
mfa_delete
114-
);
135+
data.push_str("</VersioningConfiguration>");
115136

116137
let body: Option<SegmentedBytes> = Some(SegmentedBytes::from(Bytes::from(data)));
117138
let client: &Client = self.client.as_ref().ok_or(Error::NoClientProvided)?;

src/s3/response/get_bucket_versioning.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// See the License for the specific language governing permissions and
1414
// limitations under the License.
1515

16+
use crate::s3::builders::VersioningStatus;
1617
use crate::s3::error::Error;
1718
use crate::s3::types::{FromS3Response, S3Request};
1819
use crate::s3::utils::get_option_text;
@@ -29,7 +30,7 @@ pub struct GetBucketVersioningResponse {
2930
pub headers: HeaderMap,
3031
pub region: String,
3132
pub bucket: String,
32-
pub status: Option<bool>,
33+
pub status: Option<VersioningStatus>,
3334
pub mfa_delete: Option<bool>,
3435
}
3536

@@ -47,7 +48,11 @@ impl FromS3Response for GetBucketVersioningResponse {
4748
let headers = resp.headers().clone();
4849
let body = resp.bytes().await?;
4950
let root = Element::parse(body.reader())?;
50-
let status: Option<bool> = get_option_text(&root, "Status").map(|v| v == "Enabled");
51+
let status: Option<VersioningStatus> =
52+
get_option_text(&root, "Status").map(|v| match v.as_str() {
53+
"Enabled" => VersioningStatus::Enabled,
54+
_ => VersioningStatus::Suspended, // Default case
55+
});
5156
let mfa_delete: Option<bool> = get_option_text(&root, "MFADelete").map(|v| v == "Enabled");
5257

5358
Ok(GetBucketVersioningResponse {

tests/tests.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use futures_util::Stream;
2020
use http::header;
2121
use hyper::http::Method;
2222

23-
use minio::s3::builders::{ObjectContent, ObjectToDelete};
23+
use minio::s3::builders::{ObjectContent, ObjectToDelete, VersioningStatus};
2424
use rand::{
2525
distributions::{Alphanumeric, DistString},
2626
rngs::SmallRng,
@@ -1259,7 +1259,7 @@ impl ClientTest {
12591259

12601260
self.client
12611261
.set_bucket_versioning(&bucket_name)
1262-
.status(true)
1262+
.versioning_status(VersioningStatus::Enabled)
12631263
.send()
12641264
.await
12651265
.unwrap();
@@ -1270,11 +1270,11 @@ impl ClientTest {
12701270
.send()
12711271
.await
12721272
.unwrap();
1273-
assert_eq!(resp.status, Some(true));
1273+
assert_eq!(resp.status, Some(VersioningStatus::Enabled));
12741274

12751275
self.client
12761276
.set_bucket_versioning(&bucket_name)
1277-
.status(false)
1277+
.versioning_status(VersioningStatus::Suspended)
12781278
.send()
12791279
.await
12801280
.unwrap();
@@ -1285,7 +1285,7 @@ impl ClientTest {
12851285
.send()
12861286
.await
12871287
.unwrap();
1288-
assert_eq!(resp.status, Some(false));
1288+
assert_eq!(resp.status, Some(VersioningStatus::Suspended));
12891289

12901290
self.client
12911291
.remove_bucket(&RemoveBucketArgs::new(&bucket_name).unwrap())

0 commit comments

Comments
 (0)