aws_sdk_s3/operation/
create_bucket.rs

1// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
2/// Orchestration and serialization glue logic for `CreateBucket`.
3#[derive(::std::clone::Clone, ::std::default::Default, ::std::fmt::Debug)]
4#[non_exhaustive]
5pub struct CreateBucket;
6impl CreateBucket {
7    /// Creates a new `CreateBucket`
8    pub fn new() -> Self {
9        Self
10    }
11    pub(crate) async fn orchestrate(
12        runtime_plugins: &::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins,
13        input: crate::operation::create_bucket::CreateBucketInput,
14    ) -> ::std::result::Result<
15        crate::operation::create_bucket::CreateBucketOutput,
16        ::aws_smithy_runtime_api::client::result::SdkError<
17            crate::operation::create_bucket::CreateBucketError,
18            ::aws_smithy_runtime_api::client::orchestrator::HttpResponse,
19        >,
20    > {
21        let map_err = |err: ::aws_smithy_runtime_api::client::result::SdkError<
22            ::aws_smithy_runtime_api::client::interceptors::context::Error,
23            ::aws_smithy_runtime_api::client::orchestrator::HttpResponse,
24        >| {
25            err.map_service_error(|err| {
26                err.downcast::<crate::operation::create_bucket::CreateBucketError>()
27                    .expect("correct error type")
28            })
29        };
30        let context = Self::orchestrate_with_stop_point(runtime_plugins, input, ::aws_smithy_runtime::client::orchestrator::StopPoint::None)
31            .await
32            .map_err(map_err)?;
33        let output = context.finalize().map_err(map_err)?;
34        ::std::result::Result::Ok(
35            output
36                .downcast::<crate::operation::create_bucket::CreateBucketOutput>()
37                .expect("correct output type"),
38        )
39    }
40
41    pub(crate) async fn orchestrate_with_stop_point(
42        runtime_plugins: &::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins,
43        input: crate::operation::create_bucket::CreateBucketInput,
44        stop_point: ::aws_smithy_runtime::client::orchestrator::StopPoint,
45    ) -> ::std::result::Result<
46        ::aws_smithy_runtime_api::client::interceptors::context::InterceptorContext,
47        ::aws_smithy_runtime_api::client::result::SdkError<
48            ::aws_smithy_runtime_api::client::interceptors::context::Error,
49            ::aws_smithy_runtime_api::client::orchestrator::HttpResponse,
50        >,
51    > {
52        let input = ::aws_smithy_runtime_api::client::interceptors::context::Input::erase(input);
53        ::aws_smithy_runtime::client::orchestrator::invoke_with_stop_point("s3", "CreateBucket", input, runtime_plugins, stop_point).await
54    }
55
56    pub(crate) fn operation_runtime_plugins(
57        client_runtime_plugins: ::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins,
58        client_config: &crate::config::Config,
59        config_override: ::std::option::Option<crate::config::Builder>,
60    ) -> ::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins {
61        let mut runtime_plugins = client_runtime_plugins.with_operation_plugin(Self::new());
62        runtime_plugins = runtime_plugins.with_client_plugin(crate::auth_plugin::DefaultAuthOptionsPlugin::new(vec![
63            ::aws_runtime::auth::sigv4::SCHEME_ID,
64            #[cfg(feature = "sigv4a")]
65            {
66                ::aws_runtime::auth::sigv4a::SCHEME_ID
67            },
68            crate::s3_express::auth::SCHEME_ID,
69            ::aws_smithy_runtime::client::auth::no_auth::NO_AUTH_SCHEME_ID,
70        ]));
71        if let ::std::option::Option::Some(config_override) = config_override {
72            for plugin in config_override.runtime_plugins.iter().cloned() {
73                runtime_plugins = runtime_plugins.with_operation_plugin(plugin);
74            }
75            runtime_plugins = runtime_plugins.with_operation_plugin(crate::config::ConfigOverrideRuntimePlugin::new(
76                config_override,
77                client_config.config.clone(),
78                &client_config.runtime_components,
79            ));
80        }
81        runtime_plugins
82    }
83}
84impl ::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin for CreateBucket {
85    fn config(&self) -> ::std::option::Option<::aws_smithy_types::config_bag::FrozenLayer> {
86        let mut cfg = ::aws_smithy_types::config_bag::Layer::new("CreateBucket");
87
88        cfg.store_put(::aws_smithy_runtime_api::client::ser_de::SharedRequestSerializer::new(
89            CreateBucketRequestSerializer,
90        ));
91        cfg.store_put(::aws_smithy_runtime_api::client::ser_de::SharedResponseDeserializer::new(
92            CreateBucketResponseDeserializer,
93        ));
94
95        cfg.store_put(::aws_smithy_runtime_api::client::auth::AuthSchemeOptionResolverParams::new(
96            ::aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolverParams::new(),
97        ));
98
99        cfg.store_put(::aws_smithy_runtime_api::client::orchestrator::Metadata::new("CreateBucket", "s3"));
100        let mut signing_options = ::aws_runtime::auth::SigningOptions::default();
101        signing_options.double_uri_encode = false;
102        signing_options.content_sha256_header = true;
103        signing_options.normalize_uri_path = false;
104        signing_options.payload_override = None;
105
106        cfg.store_put(::aws_runtime::auth::SigV4OperationSigningConfig {
107            signing_options,
108            ..::std::default::Default::default()
109        });
110
111        ::std::option::Option::Some(cfg.freeze())
112    }
113
114    fn runtime_components(
115        &self,
116        _: &::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder,
117    ) -> ::std::borrow::Cow<'_, ::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder> {
118        #[allow(unused_mut)]
119        let mut rcb = ::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder::new("CreateBucket")
120            .with_interceptor(::aws_smithy_runtime::client::stalled_stream_protection::StalledStreamProtectionInterceptor::default())
121            .with_interceptor(CreateBucketEndpointParamsInterceptor)
122            .with_retry_classifier(::aws_smithy_runtime::client::retries::classifiers::TransientErrorClassifier::<
123                crate::operation::create_bucket::CreateBucketError,
124            >::new())
125            .with_retry_classifier(::aws_smithy_runtime::client::retries::classifiers::ModeledAsRetryableClassifier::<
126                crate::operation::create_bucket::CreateBucketError,
127            >::new())
128            .with_retry_classifier(::aws_runtime::retries::classifiers::AwsErrorCodeClassifier::<
129                crate::operation::create_bucket::CreateBucketError,
130            >::new());
131
132        ::std::borrow::Cow::Owned(rcb)
133    }
134}
135
136#[derive(Debug)]
137struct CreateBucketResponseDeserializer;
138impl ::aws_smithy_runtime_api::client::ser_de::DeserializeResponse for CreateBucketResponseDeserializer {
139    fn deserialize_nonstreaming(
140        &self,
141        response: &::aws_smithy_runtime_api::client::orchestrator::HttpResponse,
142    ) -> ::aws_smithy_runtime_api::client::interceptors::context::OutputOrError {
143        let (success, status) = (response.status().is_success(), response.status().as_u16());
144        let headers = response.headers();
145        let body = response.body().bytes().expect("body loaded");
146        #[allow(unused_mut)]
147        let mut force_error = false;
148        ::tracing::debug!(extended_request_id = ?crate::s3_request_id::RequestIdExt::extended_request_id(response));
149        if matches!(crate::rest_xml_unwrapped_errors::body_is_error(body), Ok(true)) {
150            force_error = true;
151        }
152        ::tracing::debug!(request_id = ?::aws_types::request_id::RequestId::request_id(response));
153        let parse_result = if !success && status != 200 || force_error {
154            crate::protocol_serde::shape_create_bucket::de_create_bucket_http_error(status, headers, body)
155        } else {
156            crate::protocol_serde::shape_create_bucket::de_create_bucket_http_response(status, headers, body)
157        };
158        crate::protocol_serde::type_erase_result(parse_result)
159    }
160}
161#[derive(Debug)]
162struct CreateBucketRequestSerializer;
163impl ::aws_smithy_runtime_api::client::ser_de::SerializeRequest for CreateBucketRequestSerializer {
164    #[allow(unused_mut, clippy::let_and_return, clippy::needless_borrow, clippy::useless_conversion)]
165    fn serialize_input(
166        &self,
167        input: ::aws_smithy_runtime_api::client::interceptors::context::Input,
168        _cfg: &mut ::aws_smithy_types::config_bag::ConfigBag,
169    ) -> ::std::result::Result<::aws_smithy_runtime_api::client::orchestrator::HttpRequest, ::aws_smithy_runtime_api::box_error::BoxError> {
170        let input = input
171            .downcast::<crate::operation::create_bucket::CreateBucketInput>()
172            .expect("correct type");
173        let _header_serialization_settings = _cfg
174            .load::<crate::serialization_settings::HeaderSerializationSettings>()
175            .cloned()
176            .unwrap_or_default();
177        let mut request_builder = {
178            fn uri_base(
179                _input: &crate::operation::create_bucket::CreateBucketInput,
180                output: &mut ::std::string::String,
181            ) -> ::std::result::Result<(), ::aws_smithy_types::error::operation::BuildError> {
182                use ::std::fmt::Write as _;
183                ::std::write!(output, "/").expect("formatting should succeed");
184                ::std::result::Result::Ok(())
185            }
186            #[allow(clippy::unnecessary_wraps)]
187            fn update_http_builder(
188                input: &crate::operation::create_bucket::CreateBucketInput,
189                builder: ::http::request::Builder,
190            ) -> ::std::result::Result<::http::request::Builder, ::aws_smithy_types::error::operation::BuildError> {
191                let mut uri = ::std::string::String::new();
192                uri_base(input, &mut uri)?;
193                let builder = crate::protocol_serde::shape_create_bucket::ser_create_bucket_headers(input, builder)?;
194                ::std::result::Result::Ok(builder.method("PUT").uri(uri))
195            }
196            let mut builder = update_http_builder(&input, ::http::request::Builder::new())?;
197            builder = _header_serialization_settings.set_default_header(builder, ::http::header::CONTENT_TYPE, "application/xml");
198            builder
199        };
200        let body = ::aws_smithy_types::body::SdkBody::from(
201            crate::protocol_serde::shape_create_bucket_input::ser_create_bucket_configuration_http_payload(&input.create_bucket_configuration)?,
202        );
203        if let Some(content_length) = body.content_length() {
204            let content_length = content_length.to_string();
205            request_builder = _header_serialization_settings.set_default_header(request_builder, ::http::header::CONTENT_LENGTH, &content_length);
206        }
207        ::std::result::Result::Ok(request_builder.body(body).expect("valid request").try_into().unwrap())
208    }
209}
210#[derive(Debug)]
211struct CreateBucketEndpointParamsInterceptor;
212
213impl ::aws_smithy_runtime_api::client::interceptors::Intercept for CreateBucketEndpointParamsInterceptor {
214    fn name(&self) -> &'static str {
215        "CreateBucketEndpointParamsInterceptor"
216    }
217
218    fn read_before_execution(
219        &self,
220        context: &::aws_smithy_runtime_api::client::interceptors::context::BeforeSerializationInterceptorContextRef<
221            '_,
222            ::aws_smithy_runtime_api::client::interceptors::context::Input,
223            ::aws_smithy_runtime_api::client::interceptors::context::Output,
224            ::aws_smithy_runtime_api::client::interceptors::context::Error,
225        >,
226        cfg: &mut ::aws_smithy_types::config_bag::ConfigBag,
227    ) -> ::std::result::Result<(), ::aws_smithy_runtime_api::box_error::BoxError> {
228        let _input = context
229            .input()
230            .downcast_ref::<CreateBucketInput>()
231            .ok_or("failed to downcast to CreateBucketInput")?;
232
233        let params = crate::config::endpoint::Params::builder()
234            .set_region(cfg.load::<::aws_types::region::Region>().map(|r| r.as_ref().to_owned()))
235            .set_use_fips(cfg.load::<::aws_types::endpoint_config::UseFips>().map(|ty| ty.0))
236            .set_use_dual_stack(cfg.load::<::aws_types::endpoint_config::UseDualStack>().map(|ty| ty.0))
237            .set_endpoint(cfg.load::<::aws_types::endpoint_config::EndpointUrl>().map(|ty| ty.0.clone()))
238            .set_force_path_style(cfg.load::<crate::config::ForcePathStyle>().map(|ty| ty.0))
239            .set_use_arn_region(cfg.load::<crate::config::UseArnRegion>().map(|ty| ty.0))
240            .set_disable_multi_region_access_points(cfg.load::<crate::config::DisableMultiRegionAccessPoints>().map(|ty| ty.0))
241            .set_accelerate(cfg.load::<crate::config::Accelerate>().map(|ty| ty.0))
242            .set_disable_s3_express_session_auth(cfg.load::<crate::config::DisableS3ExpressSessionAuth>().map(|ty| ty.0))
243            .set_use_s3_express_control_endpoint(Some(true))
244            .set_disable_access_points(Some(true))
245            .set_bucket(Some(
246                _input
247                    .bucket
248                    .clone()
249                    .filter(|f| !AsRef::<str>::as_ref(f).trim().is_empty())
250                    .ok_or_else(|| ::aws_smithy_types::error::operation::BuildError::missing_field("bucket", "A required field was not set"))?,
251            ))
252            .build()
253            .map_err(|err| {
254                ::aws_smithy_runtime_api::client::interceptors::error::ContextAttachedError::new("endpoint params could not be built", err)
255            })?;
256        cfg.interceptor_state()
257            .store_put(::aws_smithy_runtime_api::client::endpoint::EndpointResolverParams::new(params));
258        ::std::result::Result::Ok(())
259    }
260}
261
262/// Error type for the `CreateBucketError` operation.
263#[non_exhaustive]
264#[derive(::std::fmt::Debug)]
265pub enum CreateBucketError {
266    /// <p>The requested bucket name is not available. The bucket namespace is shared by all users of the system. Select a different name and try again.</p>
267    BucketAlreadyExists(crate::types::error::BucketAlreadyExists),
268    /// <p>The bucket you tried to create already exists, and you own it. Amazon S3 returns this error in all Amazon Web Services Regions except in the North Virginia Region. For legacy compatibility, if you re-create an existing bucket that you already own in the North Virginia Region, Amazon S3 returns 200 OK and resets the bucket access control lists (ACLs).</p>
269    BucketAlreadyOwnedByYou(crate::types::error::BucketAlreadyOwnedByYou),
270    /// An unexpected error occurred (e.g., invalid JSON returned by the service or an unknown error code).
271    #[deprecated(note = "Matching `Unhandled` directly is not forwards compatible. Instead, match using a \
272    variable wildcard pattern and check `.code()`:
273     \
274    &nbsp;&nbsp;&nbsp;`err if err.code() == Some(\"SpecificExceptionCode\") => { /* handle the error */ }`
275     \
276    See [`ProvideErrorMetadata`](#impl-ProvideErrorMetadata-for-CreateBucketError) for what information is available for the error.")]
277    Unhandled(crate::error::sealed_unhandled::Unhandled),
278}
279impl CreateBucketError {
280    /// Creates the `CreateBucketError::Unhandled` variant from any error type.
281    pub fn unhandled(
282        err: impl ::std::convert::Into<::std::boxed::Box<dyn ::std::error::Error + ::std::marker::Send + ::std::marker::Sync + 'static>>,
283    ) -> Self {
284        Self::Unhandled(crate::error::sealed_unhandled::Unhandled {
285            source: err.into(),
286            meta: ::std::default::Default::default(),
287        })
288    }
289
290    /// Creates the `CreateBucketError::Unhandled` variant from an [`ErrorMetadata`](::aws_smithy_types::error::ErrorMetadata).
291    pub fn generic(err: ::aws_smithy_types::error::ErrorMetadata) -> Self {
292        Self::Unhandled(crate::error::sealed_unhandled::Unhandled {
293            source: err.clone().into(),
294            meta: err,
295        })
296    }
297    ///
298    /// Returns error metadata, which includes the error code, message,
299    /// request ID, and potentially additional information.
300    ///
301    pub fn meta(&self) -> &::aws_smithy_types::error::ErrorMetadata {
302        match self {
303            Self::BucketAlreadyExists(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
304            Self::BucketAlreadyOwnedByYou(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
305            Self::Unhandled(e) => &e.meta,
306        }
307    }
308    /// Returns `true` if the error kind is `CreateBucketError::BucketAlreadyExists`.
309    pub fn is_bucket_already_exists(&self) -> bool {
310        matches!(self, Self::BucketAlreadyExists(_))
311    }
312    /// Returns `true` if the error kind is `CreateBucketError::BucketAlreadyOwnedByYou`.
313    pub fn is_bucket_already_owned_by_you(&self) -> bool {
314        matches!(self, Self::BucketAlreadyOwnedByYou(_))
315    }
316}
317impl ::std::error::Error for CreateBucketError {
318    fn source(&self) -> ::std::option::Option<&(dyn ::std::error::Error + 'static)> {
319        match self {
320            Self::BucketAlreadyExists(_inner) => ::std::option::Option::Some(_inner),
321            Self::BucketAlreadyOwnedByYou(_inner) => ::std::option::Option::Some(_inner),
322            Self::Unhandled(_inner) => ::std::option::Option::Some(&*_inner.source),
323        }
324    }
325}
326impl ::std::fmt::Display for CreateBucketError {
327    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
328        match self {
329            Self::BucketAlreadyExists(_inner) => _inner.fmt(f),
330            Self::BucketAlreadyOwnedByYou(_inner) => _inner.fmt(f),
331            Self::Unhandled(_inner) => {
332                if let ::std::option::Option::Some(code) = ::aws_smithy_types::error::metadata::ProvideErrorMetadata::code(self) {
333                    write!(f, "unhandled error ({code})")
334                } else {
335                    f.write_str("unhandled error")
336                }
337            }
338        }
339    }
340}
341impl ::aws_smithy_types::retry::ProvideErrorKind for CreateBucketError {
342    fn code(&self) -> ::std::option::Option<&str> {
343        ::aws_smithy_types::error::metadata::ProvideErrorMetadata::code(self)
344    }
345    fn retryable_error_kind(&self) -> ::std::option::Option<::aws_smithy_types::retry::ErrorKind> {
346        ::std::option::Option::None
347    }
348}
349impl ::aws_smithy_types::error::metadata::ProvideErrorMetadata for CreateBucketError {
350    fn meta(&self) -> &::aws_smithy_types::error::ErrorMetadata {
351        match self {
352            Self::BucketAlreadyExists(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
353            Self::BucketAlreadyOwnedByYou(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
354            Self::Unhandled(_inner) => &_inner.meta,
355        }
356    }
357}
358impl ::aws_smithy_runtime_api::client::result::CreateUnhandledError for CreateBucketError {
359    fn create_unhandled_error(
360        source: ::std::boxed::Box<dyn ::std::error::Error + ::std::marker::Send + ::std::marker::Sync + 'static>,
361        meta: ::std::option::Option<::aws_smithy_types::error::ErrorMetadata>,
362    ) -> Self {
363        Self::Unhandled(crate::error::sealed_unhandled::Unhandled {
364            source,
365            meta: meta.unwrap_or_default(),
366        })
367    }
368}
369impl crate::s3_request_id::RequestIdExt for crate::operation::create_bucket::CreateBucketError {
370    fn extended_request_id(&self) -> Option<&str> {
371        self.meta().extended_request_id()
372    }
373}
374impl ::aws_types::request_id::RequestId for crate::operation::create_bucket::CreateBucketError {
375    fn request_id(&self) -> Option<&str> {
376        self.meta().request_id()
377    }
378}
379
380pub use crate::operation::create_bucket::_create_bucket_output::CreateBucketOutput;
381
382pub use crate::operation::create_bucket::_create_bucket_input::CreateBucketInput;
383
384mod _create_bucket_input;
385
386mod _create_bucket_output;
387
388/// Builders
389pub mod builders;