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}