s3/bucket/create.rs
1use crate::bucket::Bucket;
2use crate::command::Command;
3use crate::error::S3Error;
4use crate::request::Request;
5use crate::request::RequestImpl;
6use crate::BucketConfiguration;
7use awscreds::Credentials;
8use awsregion::Region;
9use http::HeaderMap;
10use std::{
11 collections::HashMap,
12 sync::{Arc, RwLock},
13};
14
15use super::DEFAULT_REQUEST_TIMEOUT;
16
17#[allow(dead_code)]
18pub struct CreateBucketResponse {
19 pub bucket: Bucket,
20 pub response_text: String,
21 pub response_code: u16,
22}
23
24impl CreateBucketResponse {
25 pub fn success(&self) -> bool {
26 self.response_code == 200
27 }
28}
29
30impl Bucket {
31 /// Create a new `Bucket` and instantiate it
32 ///
33 /// ```no_run
34 /// use s3::{Bucket, BucketConfiguration};
35 /// use s3::creds::Credentials;
36 /// # use s3::region::Region;
37 /// use anyhow::Result;
38 ///
39 /// # #[tokio::main]
40 /// # async fn main() -> Result<()> {
41 /// let bucket_name = "rust-s3-test";
42 /// let region = "us-east-1".parse()?;
43 /// let credentials = Credentials::default()?;
44 /// let config = BucketConfiguration::default();
45 ///
46 /// let create_bucket_response = Bucket::create(bucket_name, region, credentials, config).await?;
47 ///
48 /// # Ok(())
49 /// # }
50 /// ```
51 pub async fn create(
52 name: &str,
53 region: Region,
54 credentials: Credentials,
55 config: BucketConfiguration,
56 ) -> Result<CreateBucketResponse, S3Error> {
57 let mut config = config;
58 config.set_region(region.clone());
59 let command = Command::CreateBucket { config };
60 let bucket = Bucket::new(name, region, credentials)?;
61 let request = RequestImpl::new(&bucket, "", command)?;
62 let response_data = request.response_data(false).await?;
63 let response_text = response_data.as_str()?;
64 Ok(CreateBucketResponse {
65 bucket,
66 response_text: response_text.to_string(),
67 response_code: response_data.status_code(),
68 })
69 }
70
71 /// Create a new `Bucket` with path style and instantiate it
72 ///
73 /// ```no_run
74 /// use s3::{Bucket, BucketConfiguration};
75 /// use s3::creds::Credentials;
76 /// # use s3::region::Region;
77 /// use anyhow::Result;
78 ///
79 /// # #[tokio::main]
80 /// # async fn main() -> Result<()> {
81 /// let bucket_name = "rust-s3-test";
82 /// let region = "us-east-1".parse()?;
83 /// let credentials = Credentials::default()?;
84 /// let config = BucketConfiguration::default();
85 ///
86 /// let create_bucket_response = Bucket::create_with_path_style(bucket_name, region, credentials, config).await?;
87 ///
88 /// # Ok(())
89 /// # }
90 /// ```
91 pub async fn create_with_path_style(
92 name: &str,
93 region: Region,
94 credentials: Credentials,
95 config: BucketConfiguration,
96 ) -> Result<CreateBucketResponse, S3Error> {
97 let mut config = config;
98 config.set_region(region.clone());
99 let command = Command::CreateBucket { config };
100 let bucket = Bucket::new(name, region, credentials)?.with_path_style();
101 let request = RequestImpl::new(&bucket, "", command)?;
102 let response_data = request.response_data(false).await?;
103 let response_text = response_data.to_string()?;
104 Ok(CreateBucketResponse {
105 bucket,
106 response_text,
107 response_code: response_data.status_code(),
108 })
109 }
110
111 /// Instantiate an existing `Bucket`.
112 ///
113 /// # Example
114 /// ```no_run
115 /// use s3::bucket::Bucket;
116 /// use s3::creds::Credentials;
117 ///
118 /// // Fake credentials so we don't access user's real credentials in tests
119 /// let bucket_name = "rust-s3-test";
120 /// let region = "us-east-1".parse().unwrap();
121 /// let credentials = Credentials::default().unwrap();
122 ///
123 /// let bucket = Bucket::new(bucket_name, region, credentials).unwrap();
124 /// ```
125 pub fn new(name: &str, region: Region, credentials: Credentials) -> Result<Bucket, S3Error> {
126 Ok(Bucket {
127 name: name.into(),
128 region,
129 credentials: Arc::new(RwLock::new(credentials)),
130 extra_headers: HeaderMap::new(),
131 extra_query: HashMap::new(),
132 request_timeout: DEFAULT_REQUEST_TIMEOUT,
133 path_style: false,
134 listobjects_v2: true,
135 })
136 }
137
138 /// Instantiate a public existing `Bucket`.
139 ///
140 /// # Example
141 /// ```no_run
142 /// use s3::bucket::Bucket;
143 ///
144 /// let bucket_name = "rust-s3-test";
145 /// let region = "us-east-1".parse().unwrap();
146 ///
147 /// let bucket = Bucket::new_public(bucket_name, region).unwrap();
148 /// ```
149 pub fn new_public(name: &str, region: Region) -> Result<Bucket, S3Error> {
150 Ok(Bucket {
151 name: name.into(),
152 region,
153 credentials: Arc::new(RwLock::new(Credentials::anonymous()?)),
154 extra_headers: HeaderMap::new(),
155 extra_query: HashMap::new(),
156 request_timeout: DEFAULT_REQUEST_TIMEOUT,
157 path_style: false,
158 listobjects_v2: true,
159 })
160 }
161}