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