Skip to content

Commit d6845a2

Browse files
committed
refactor set_bucket_versioning
1 parent 1a77ca8 commit d6845a2

File tree

9 files changed

+213
-95
lines changed

9 files changed

+213
-95
lines changed

examples/get_bucket_versioning.rs

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

1818
use crate::common::{create_bucket_if_not_exists, create_client_on_play};
19-
use minio::s3::args::SetBucketVersioningArgs;
2019
use minio::s3::response::{GetBucketVersioningResponse, SetBucketVersioningResponse};
2120
use minio::s3::types::S3Api;
2221
use minio::s3::Client;
@@ -38,7 +37,10 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
3837
);
3938

4039
let _resp: SetBucketVersioningResponse = client
41-
.set_bucket_versioning(&SetBucketVersioningArgs::new(bucket_name, true).unwrap())
40+
.set_bucket_versioning(bucket_name)
41+
.status(true)
42+
.mfa_delete(Some(true))
43+
.send()
4244
.await?;
4345

4446
let resp: GetBucketVersioningResponse =
@@ -51,7 +53,10 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
5153
);
5254

5355
let _resp: SetBucketVersioningResponse = client
54-
.set_bucket_versioning(&SetBucketVersioningArgs::new(bucket_name, false).unwrap())
56+
.set_bucket_versioning(bucket_name)
57+
.status(false)
58+
.mfa_delete(Some(true))
59+
.send()
5560
.await?;
5661

5762
let resp: GetBucketVersioningResponse =

src/s3/args.rs

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1623,39 +1623,6 @@ impl<'a> SetBucketTagsArgs<'a> {
16231623
}
16241624
}
16251625

1626-
/// Argument for [set_bucket_versioning()](crate::s3::client::Client::set_bucket_versioning) API
1627-
pub struct SetBucketVersioningArgs<'a> {
1628-
pub extra_headers: Option<&'a Multimap>,
1629-
pub extra_query_params: Option<&'a Multimap>,
1630-
pub region: Option<&'a str>,
1631-
pub bucket: &'a str,
1632-
pub status: bool,
1633-
pub mfa_delete: Option<bool>,
1634-
}
1635-
1636-
impl<'a> SetBucketVersioningArgs<'a> {
1637-
/// Returns argument for [set_bucket_versioning()](crate::s3::client::Client::set_bucket_versioning) API with given bucket name and status
1638-
///
1639-
/// # Examples
1640-
///
1641-
/// ```
1642-
/// use minio::s3::args::*;
1643-
/// let args = SetBucketVersioningArgs::new("my-bucket", true).unwrap();
1644-
/// ```
1645-
pub fn new(bucket_name: &'a str, status: bool) -> Result<SetBucketVersioningArgs<'a>, Error> {
1646-
check_bucket_name(bucket_name, true)?;
1647-
1648-
Ok(SetBucketVersioningArgs {
1649-
extra_headers: None,
1650-
extra_query_params: None,
1651-
region: None,
1652-
bucket: bucket_name,
1653-
status,
1654-
mfa_delete: None,
1655-
})
1656-
}
1657-
}
1658-
16591626
/// Argument for [delete_object_lock_config()](crate::s3::client::Client::delete_object_lock_config) API
16601627
pub type DeleteObjectLockConfigArgs<'a> = BucketArgs<'a>;
16611628

src/s3/builders.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ mod object_prompt;
2727
mod put_object;
2828
mod remove_objects;
2929
mod set_bucket_encryption;
30+
mod set_bucket_versioning;
3031

3132
pub use bucket_common::*;
3233
pub use get_bucket_encryption::*;
@@ -40,3 +41,4 @@ pub use object_prompt::*;
4041
pub use put_object::*;
4142
pub use remove_objects::*;
4243
pub use set_bucket_encryption::*;
44+
pub use set_bucket_versioning::*;
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
// MinIO Rust Library for Amazon S3 Compatible Cloud Storage
2+
// Copyright 2025 MinIO, Inc.
3+
//
4+
// Licensed under the Apache License, Version 2.0 (the "License");
5+
// you may not use this file except in compliance with the License.
6+
// You may obtain a copy of the License at
7+
//
8+
// http://www.apache.org/licenses/LICENSE-2.0
9+
//
10+
// Unless required by applicable law or agreed to in writing, software
11+
// distributed under the License is distributed on an "AS IS" BASIS,
12+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
// See the License for the specific language governing permissions and
14+
// limitations under the License.
15+
16+
use crate::s3::builders::SegmentedBytes;
17+
use crate::s3::error::Error;
18+
use crate::s3::response::SetBucketVersioningResponse;
19+
use crate::s3::types::{S3Api, S3Request, ToS3Request};
20+
use crate::s3::utils::{check_bucket_name, merge, Multimap};
21+
use crate::s3::Client;
22+
use bytes::Bytes;
23+
use http::Method;
24+
25+
/// Argument builder for [set_bucket_encryption()](Client::set_bucket_encryption) API
26+
#[derive(Clone, Debug, Default)]
27+
pub struct SetBucketVersioning {
28+
pub(crate) client: Option<Client>,
29+
30+
pub(crate) extra_headers: Option<Multimap>,
31+
pub(crate) extra_query_params: Option<Multimap>,
32+
pub(crate) region: Option<String>,
33+
pub(crate) bucket: String,
34+
35+
pub(crate) status: bool,
36+
pub(crate) mfa_delete: Option<bool>,
37+
}
38+
39+
impl SetBucketVersioning {
40+
pub fn new(bucket: &str) -> Self {
41+
Self {
42+
bucket: bucket.to_owned(),
43+
..Default::default()
44+
}
45+
}
46+
pub fn client(mut self, client: &Client) -> Self {
47+
self.client = Some(client.clone());
48+
self
49+
}
50+
51+
pub fn extra_headers(mut self, extra_headers: Option<Multimap>) -> Self {
52+
self.extra_headers = extra_headers;
53+
self
54+
}
55+
56+
pub fn extra_query_params(mut self, extra_query_params: Option<Multimap>) -> Self {
57+
self.extra_query_params = extra_query_params;
58+
self
59+
}
60+
61+
pub fn region(mut self, region: Option<String>) -> Self {
62+
self.region = region;
63+
self
64+
}
65+
66+
pub fn status(mut self, status: bool) -> Self {
67+
self.status = status;
68+
self
69+
}
70+
71+
pub fn mfa_delete(mut self, mfa_delete: Option<bool>) -> Self {
72+
self.mfa_delete = mfa_delete;
73+
self
74+
}
75+
}
76+
77+
impl S3Api for SetBucketVersioning {
78+
type S3Response = SetBucketVersioningResponse;
79+
}
80+
81+
impl ToS3Request for SetBucketVersioning {
82+
fn to_s3request(&self) -> Result<S3Request, Error> {
83+
check_bucket_name(&self.bucket, true)?;
84+
let mut headers = Multimap::new();
85+
if let Some(v) = &self.extra_headers {
86+
merge(&mut headers, v);
87+
}
88+
89+
let mut query_params = Multimap::new();
90+
if let Some(v) = &self.extra_query_params {
91+
merge(&mut query_params, v);
92+
}
93+
query_params.insert(String::from("versioning"), String::new());
94+
95+
let mut data = String::from("<VersioningConfiguration>");
96+
data.push_str("<Status>");
97+
data.push_str(match self.status {
98+
true => "Enabled",
99+
false => "Suspended",
100+
});
101+
data.push_str("</Status>");
102+
if let Some(v) = self.mfa_delete {
103+
data.push_str("<MFADelete>");
104+
data.push_str(match v {
105+
true => "Enabled",
106+
false => "Disabled",
107+
});
108+
data.push_str("</MFADelete>");
109+
}
110+
data.push_str("</VersioningConfiguration>");
111+
112+
let bytes: Bytes = data.into();
113+
let body: Option<SegmentedBytes> = Some(SegmentedBytes::from(bytes));
114+
115+
let req = S3Request::new(
116+
self.client.as_ref().ok_or(Error::NoClientProvided)?,
117+
Method::GET,
118+
)
119+
.region(self.region.as_deref())
120+
.bucket(Some(&self.bucket))
121+
.query_params(query_params)
122+
.headers(headers)
123+
.body(body);
124+
125+
Ok(req)
126+
}
127+
}

src/s3/client.rs

Lines changed: 1 addition & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ mod object_prompt;
5656
mod put_object;
5757
mod remove_objects;
5858
mod set_bucket_encryption;
59+
mod set_bucket_versioning;
5960

6061
use super::builders::{ListBuckets, SegmentedBytes};
6162

@@ -2721,59 +2722,6 @@ impl Client {
27212722
})
27222723
}
27232724

2724-
pub async fn set_bucket_versioning(
2725-
&self,
2726-
args: &SetBucketVersioningArgs<'_>,
2727-
) -> Result<SetBucketVersioningResponse, Error> {
2728-
let region = self.get_region(args.bucket, args.region).await?;
2729-
2730-
let mut headers = Multimap::new();
2731-
if let Some(v) = &args.extra_headers {
2732-
merge(&mut headers, v);
2733-
}
2734-
2735-
let mut query_params = Multimap::new();
2736-
if let Some(v) = &args.extra_query_params {
2737-
merge(&mut query_params, v);
2738-
}
2739-
query_params.insert(String::from("versioning"), String::new());
2740-
2741-
let mut data = String::from("<VersioningConfiguration>");
2742-
data.push_str("<Status>");
2743-
data.push_str(match args.status {
2744-
true => "Enabled",
2745-
false => "Suspended",
2746-
});
2747-
data.push_str("</Status>");
2748-
if let Some(v) = args.mfa_delete {
2749-
data.push_str("<MFADelete>");
2750-
data.push_str(match v {
2751-
true => "Enabled",
2752-
false => "Disabled",
2753-
});
2754-
data.push_str("</MFADelete>");
2755-
}
2756-
data.push_str("</VersioningConfiguration>");
2757-
2758-
let resp = self
2759-
.execute(
2760-
Method::PUT,
2761-
&region,
2762-
&mut headers,
2763-
&query_params,
2764-
Some(args.bucket),
2765-
None,
2766-
Some(data.into()),
2767-
)
2768-
.await?;
2769-
2770-
Ok(SetBucketVersioningResponse {
2771-
headers: resp.headers().clone(),
2772-
region: region.clone(),
2773-
bucket_name: args.bucket.to_string(),
2774-
})
2775-
}
2776-
27772725
pub async fn set_object_lock_config(
27782726
&self,
27792727
args: &SetObjectLockConfigArgs<'_>,
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// MinIO Rust Library for Amazon S3 Compatible Cloud Storage
2+
// Copyright 2025 MinIO, Inc.
3+
//
4+
// Licensed under the Apache License, Version 2.0 (the "License");
5+
// you may not use this file except in compliance with the License.
6+
// You may obtain a copy of the License at
7+
//
8+
// http://www.apache.org/licenses/LICENSE-2.0
9+
//
10+
// Unless required by applicable law or agreed to in writing, software
11+
// distributed under the License is distributed on an "AS IS" BASIS,
12+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
// See the License for the specific language governing permissions and
14+
// limitations under the License.
15+
16+
//! S3 APIs for bucket objects.
17+
18+
use super::Client;
19+
use crate::s3::builders::SetBucketVersioning;
20+
21+
impl Client {
22+
/// Create a SetBucketVersioning request builder.
23+
pub fn set_bucket_versioning(&self, bucket: &str) -> SetBucketVersioning {
24+
SetBucketVersioning::new(bucket).client(self)
25+
}
26+
}

src/s3/response.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ mod object_prompt;
4141
mod put_object;
4242
mod remove_objects;
4343
mod set_bucket_encryption;
44+
mod set_bucket_versioning;
4445

4546
pub use get_bucket_encryption::GetBucketEncryptionResponse;
4647
pub use get_bucket_versioning::GetBucketVersioningResponse;
@@ -56,6 +57,7 @@ pub use put_object::{
5657
};
5758
pub use remove_objects::{DeleteError, DeletedObject, RemoveObjectResponse, RemoveObjectsResponse};
5859
pub use set_bucket_encryption::SetBucketEncryptionResponse;
60+
pub use set_bucket_versioning::SetBucketVersioningResponse;
5961

6062
#[derive(Debug)]
6163
/// Base response for bucket operation
@@ -555,7 +557,6 @@ impl SelectObjectContentResponse {
555557

556558
/// Response of [delete_bucket_encryption()](crate::s3::client::Client::delete_bucket_encryption) API
557559
pub type DeleteBucketEncryptionResponse = BucketResponse;
558-
559560
/// Response of [enable_object_legal_hold()](crate::s3::client::Client::enable_object_legal_hold) API
560561
pub type EnableObjectLegalHoldResponse = ObjectResponse;
561562

@@ -648,9 +649,6 @@ pub struct GetBucketTagsResponse {
648649
/// Response of [set_bucket_tags()](crate::s3::client::Client::set_bucket_tags) API
649650
pub type SetBucketTagsResponse = BucketResponse;
650651

651-
/// Response of [set_bucket_versioning()](crate::s3::client::Client::set_bucket_versioning) API
652-
pub type SetBucketVersioningResponse = BucketResponse;
653-
654652
/// Response of [delete_object_lock_config()](crate::s3::client::Client::delete_object_lock_config) API
655653
pub type DeleteObjectLockConfigResponse = BucketResponse;
656654

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// MinIO Rust Library for Amazon S3 Compatible Cloud Storage
2+
// Copyright 2025 MinIO, Inc.
3+
//
4+
// Licensed under the Apache License, Version 2.0 (the "License");
5+
// you may not use this file except in compliance with the License.
6+
// You may obtain a copy of the License at
7+
//
8+
// http://www.apache.org/licenses/LICENSE-2.0
9+
//
10+
// Unless required by applicable law or agreed to in writing, software
11+
// distributed under the License is distributed on an "AS IS" BASIS,
12+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
// See the License for the specific language governing permissions and
14+
// limitations under the License.
15+
16+
use crate::s3::error::Error;
17+
use crate::s3::response::BucketResponse;
18+
use crate::s3::types::{FromS3Response, S3Request};
19+
use async_trait::async_trait;
20+
21+
/// Response of [set_bucket_versioning()](Client::set_bucket_versioning) API
22+
pub type SetBucketVersioningResponse = BucketResponse;
23+
24+
#[async_trait]
25+
impl FromS3Response for SetBucketVersioningResponse {
26+
async fn from_s3response<'a>(
27+
req: S3Request<'a>,
28+
resp: reqwest::Response,
29+
) -> Result<Self, Error> {
30+
let bucket: String = match req.bucket {
31+
None => return Err(Error::InvalidBucketName("no bucket specified".to_string())),
32+
Some(v) => v.to_string(),
33+
};
34+
35+
Ok(SetBucketVersioningResponse {
36+
headers: resp.headers().clone(),
37+
region: req.get_computed_region(),
38+
bucket_name: bucket,
39+
})
40+
}
41+
}

0 commit comments

Comments
 (0)