@@ -4,6 +4,7 @@ use std::collections::HashMap;
4
4
use std:: mem;
5
5
use tokio:: runtime:: Runtime ;
6
6
7
+ use crate :: bucket_ops:: { BucketConfiguration , CreateBucketResponse } ;
7
8
use crate :: command:: Command ;
8
9
use crate :: creds:: Credentials ;
9
10
use crate :: region:: Region ;
@@ -125,17 +126,79 @@ impl Bucket {
125
126
) ;
126
127
Ok ( request. presigned ( ) ?)
127
128
}
128
- /// Instantiate a new `Bucket`.
129
+ /// Create a new `Bucket` and instantiate it
129
130
///
130
131
/// # Example
132
+ /// ```rust,no_run
133
+ /// use s3::{Bucket, BucketConfiguration};
134
+ /// use s3::creds::Credentials;
135
+ /// use s3::S3Error;
136
+ ///
137
+ /// #[tokio::main]
138
+ /// async fn main() -> Result<(), S3Error> {
139
+ /// let bucket_name = "rust-s3-test";
140
+ /// let region = "us-east-1".parse().unwrap();
141
+ /// let credentials = Credentials::default().unwrap();
142
+ /// let config = BucketConfiguration::default();
143
+ ///
144
+ /// let create_bucket_response = Bucket::create(bucket_name, region, credentials, config).await.unwrap();
145
+ /// Ok(())
146
+ /// }
131
147
/// ```
132
- /// # // Fake credentials so we don't access user's real credentials in tests
133
- /// # use std::env;
134
- /// # env::set_var("AWS_ACCESS_KEY_ID", "AKIAIOSFODNN7EXAMPLE");
135
- /// # env::set_var("AWS_SECRET_ACCESS_KEY", "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY");
148
+ pub async fn create (
149
+ name : & str ,
150
+ region : Region ,
151
+ credentials : Credentials ,
152
+ mut config : BucketConfiguration ,
153
+ ) -> Result < CreateBucketResponse > {
154
+ config. set_region ( region. clone ( ) ) ;
155
+ let command = Command :: CreateBucket { config } ;
156
+ let bucket = Bucket :: new ( name, region, credentials) ?;
157
+ let request = Request :: new ( & bucket, "" , command) ;
158
+ let ( data, response_code) = request. response_data_future ( false ) . await ?;
159
+ let response_text = std:: str:: from_utf8 ( & data) ?;
160
+ Ok ( CreateBucketResponse {
161
+ bucket,
162
+ response_text : response_text. to_string ( ) ,
163
+ response_code,
164
+ } )
165
+ }
166
+
167
+ /// Delete existing `Bucket`
168
+ ///
169
+ /// # Example
170
+ /// ```rust,no_run
171
+ /// use s3::Bucket;
172
+ /// use s3::creds::Credentials;
173
+ /// use s3::S3Error;
174
+ ///
175
+ /// #[tokio::main]
176
+ /// async fn main() -> Result<(), S3Error> {
177
+ /// let bucket_name = "rust-s3-test";
178
+ /// let region = "us-east-1".parse().unwrap();
179
+ /// let credentials = Credentials::default().unwrap();
180
+ /// let bucket = Bucket::new(bucket_name, region, credentials).unwrap();
181
+ ///
182
+ /// bucket.delete().await.unwrap();
183
+ ///
184
+ /// Ok(())
185
+ /// }
186
+ /// ```
187
+ pub async fn delete ( & self ) -> Result < u16 > {
188
+ let command = Command :: DeleteBucket ;
189
+ let request = Request :: new ( self , "" , command) ;
190
+ let ( _, response_code) = request. response_data_future ( false ) . await ?;
191
+ Ok ( response_code)
192
+ }
193
+
194
+ /// Instantiate an existing `Bucket`.
195
+ ///
196
+ /// # Example
197
+ /// ```rust,no_run
136
198
/// use s3::bucket::Bucket;
137
199
/// use s3::creds::Credentials;
138
200
///
201
+ /// // Fake credentials so we don't access user's real credentials in tests
139
202
/// let bucket_name = "rust-s3-test";
140
203
/// let region = "us-east-1".parse().unwrap();
141
204
/// let credentials = Credentials::default().unwrap();
@@ -1305,9 +1368,10 @@ impl Bucket {
1305
1368
#[ cfg( test) ]
1306
1369
mod test {
1307
1370
1308
- use crate :: bucket:: Bucket ;
1309
1371
use crate :: creds:: Credentials ;
1310
1372
use crate :: region:: Region ;
1373
+ use crate :: Bucket ;
1374
+ use crate :: BucketConfiguration ;
1311
1375
use std:: env;
1312
1376
use std:: fs:: File ;
1313
1377
use std:: io:: prelude:: * ;
@@ -1544,4 +1608,67 @@ mod test {
1544
1608
let url = bucket. presign_get ( s3_path, 86400 ) . unwrap ( ) ;
1545
1609
assert ! ( url. contains( "/test%2Ftest.file?" ) )
1546
1610
}
1611
+
1612
+ #[ tokio:: test]
1613
+ #[ ignore]
1614
+ async fn test_bucket_create_delete_default_region ( ) {
1615
+ let config = BucketConfiguration :: default ( ) ;
1616
+ let response = Bucket :: create (
1617
+ & uuid:: Uuid :: new_v4 ( ) . to_string ( ) ,
1618
+ "us-east-1" . parse ( ) . unwrap ( ) ,
1619
+ test_aws_credentials ( ) ,
1620
+ config,
1621
+ )
1622
+ . await
1623
+ . unwrap ( ) ;
1624
+
1625
+ assert_eq ! ( & response. response_text, "" ) ;
1626
+
1627
+ assert_eq ! ( response. response_code, 200 ) ;
1628
+
1629
+ let response_code = response. bucket . delete ( ) . await . unwrap ( ) ;
1630
+ assert ! ( response_code < 300 ) ;
1631
+ }
1632
+
1633
+ #[ tokio:: test]
1634
+ #[ ignore]
1635
+ async fn test_bucket_create_delete_non_default_region ( ) {
1636
+ let config = BucketConfiguration :: default ( ) ;
1637
+ let response = Bucket :: create (
1638
+ & uuid:: Uuid :: new_v4 ( ) . to_string ( ) ,
1639
+ "eu-central-1" . parse ( ) . unwrap ( ) ,
1640
+ test_aws_credentials ( ) ,
1641
+ config,
1642
+ )
1643
+ . await
1644
+ . unwrap ( ) ;
1645
+
1646
+ assert_eq ! ( & response. response_text, "" ) ;
1647
+
1648
+ assert_eq ! ( response. response_code, 200 ) ;
1649
+
1650
+ let response_code = response. bucket . delete ( ) . await . unwrap ( ) ;
1651
+ assert ! ( response_code < 300 ) ;
1652
+ }
1653
+
1654
+ #[ tokio:: test]
1655
+ #[ ignore]
1656
+ async fn test_bucket_create_delete_non_default_region_public ( ) {
1657
+ let config = BucketConfiguration :: public ( ) ;
1658
+ let response = Bucket :: create (
1659
+ & uuid:: Uuid :: new_v4 ( ) . to_string ( ) ,
1660
+ "eu-central-1" . parse ( ) . unwrap ( ) ,
1661
+ test_aws_credentials ( ) ,
1662
+ config,
1663
+ )
1664
+ . await
1665
+ . unwrap ( ) ;
1666
+
1667
+ assert_eq ! ( & response. response_text, "" ) ;
1668
+
1669
+ assert_eq ! ( response. response_code, 200 ) ;
1670
+
1671
+ let response_code = response. bucket . delete ( ) . await . unwrap ( ) ;
1672
+ assert ! ( response_code < 300 ) ;
1673
+ }
1547
1674
}
0 commit comments