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        use ::tracing::Instrument;
54        ::aws_smithy_runtime::client::orchestrator::invoke_with_stop_point("S3", "CreateBucket", input, runtime_plugins, stop_point)
55            // Create a parent span for the entire operation. Includes a random, internal-only,
56            // seven-digit ID for the operation orchestration so that it can be correlated in the logs.
57            .instrument(::tracing::debug_span!(
58                "S3.CreateBucket",
59                "rpc.service" = "S3",
60                "rpc.method" = "CreateBucket",
61                "sdk_invocation_id" = ::fastrand::u32(1_000_000..10_000_000),
62                "rpc.system" = "aws-api",
63            ))
64            .await
65    }
66
67    pub(crate) fn operation_runtime_plugins(
68        client_runtime_plugins: ::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins,
69        client_config: &crate::config::Config,
70        config_override: ::std::option::Option<crate::config::Builder>,
71    ) -> ::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins {
72        let mut runtime_plugins = client_runtime_plugins.with_operation_plugin(Self::new());
73
74        if let ::std::option::Option::Some(config_override) = config_override {
75            for plugin in config_override.runtime_plugins.iter().cloned() {
76                runtime_plugins = runtime_plugins.with_operation_plugin(plugin);
77            }
78            runtime_plugins = runtime_plugins.with_operation_plugin(crate::config::ConfigOverrideRuntimePlugin::new(
79                config_override,
80                client_config.config.clone(),
81                &client_config.runtime_components,
82            ));
83        }
84        runtime_plugins
85    }
86}
87impl ::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin for CreateBucket {
88    fn config(&self) -> ::std::option::Option<::aws_smithy_types::config_bag::FrozenLayer> {
89        let mut cfg = ::aws_smithy_types::config_bag::Layer::new("CreateBucket");
90
91        cfg.store_put(::aws_smithy_runtime_api::client::ser_de::SharedRequestSerializer::new(
92            CreateBucketRequestSerializer,
93        ));
94        cfg.store_put(::aws_smithy_runtime_api::client::ser_de::SharedResponseDeserializer::new(
95            CreateBucketResponseDeserializer,
96        ));
97
98        cfg.store_put(::aws_smithy_runtime_api::client::auth::AuthSchemeOptionResolverParams::new(
99            crate::config::auth::Params::builder()
100                .operation_name("CreateBucket")
101                .build()
102                .expect("required fields set"),
103        ));
104
105        cfg.store_put(::aws_smithy_runtime_api::client::orchestrator::Metadata::new("CreateBucket", "S3"));
106        let mut signing_options = ::aws_runtime::auth::SigningOptions::default();
107        signing_options.double_uri_encode = false;
108        signing_options.content_sha256_header = true;
109        signing_options.normalize_uri_path = false;
110        signing_options.payload_override = None;
111
112        cfg.store_put(::aws_runtime::auth::SigV4OperationSigningConfig {
113            signing_options,
114            ..::std::default::Default::default()
115        });
116
117        ::std::option::Option::Some(cfg.freeze())
118    }
119
120    fn runtime_components(
121        &self,
122        _: &::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder,
123    ) -> ::std::borrow::Cow<'_, ::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder> {
124        #[allow(unused_mut)]
125        let mut rcb = ::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder::new("CreateBucket")
126            .with_interceptor(::aws_smithy_runtime::client::stalled_stream_protection::StalledStreamProtectionInterceptor::default())
127            .with_interceptor(CreateBucketEndpointParamsInterceptor)
128            .with_retry_classifier(::aws_smithy_runtime::client::retries::classifiers::TransientErrorClassifier::<
129                crate::operation::create_bucket::CreateBucketError,
130            >::new())
131            .with_retry_classifier(::aws_smithy_runtime::client::retries::classifiers::ModeledAsRetryableClassifier::<
132                crate::operation::create_bucket::CreateBucketError,
133            >::new())
134            .with_retry_classifier(
135                ::aws_runtime::retries::classifiers::AwsErrorCodeClassifier::<crate::operation::create_bucket::CreateBucketError>::builder()
136                    .transient_errors({
137                        let mut transient_errors: Vec<&'static str> = ::aws_runtime::retries::classifiers::TRANSIENT_ERRORS.into();
138                        transient_errors.push("InternalError");
139                        ::std::borrow::Cow::Owned(transient_errors)
140                    })
141                    .build(),
142            );
143
144        ::std::borrow::Cow::Owned(rcb)
145    }
146}
147
148#[derive(Debug)]
149struct CreateBucketResponseDeserializer;
150impl ::aws_smithy_runtime_api::client::ser_de::DeserializeResponse for CreateBucketResponseDeserializer {
151    fn deserialize_nonstreaming(
152        &self,
153        response: &::aws_smithy_runtime_api::client::orchestrator::HttpResponse,
154    ) -> ::aws_smithy_runtime_api::client::interceptors::context::OutputOrError {
155        let (success, status) = (response.status().is_success(), response.status().as_u16());
156        let headers = response.headers();
157        let body = response.body().bytes().expect("body loaded");
158        #[allow(unused_mut)]
159        let mut force_error = false;
160        ::tracing::debug!(extended_request_id = ?crate::s3_request_id::RequestIdExt::extended_request_id(response));
161        if matches!(crate::rest_xml_unwrapped_errors::body_is_error(body), Ok(true)) {
162            force_error = true;
163        }
164        ::tracing::debug!(request_id = ?::aws_types::request_id::RequestId::request_id(response));
165        let parse_result = if !success && status != 200 || force_error {
166            crate::protocol_serde::shape_create_bucket::de_create_bucket_http_error(status, headers, body)
167        } else {
168            crate::protocol_serde::shape_create_bucket::de_create_bucket_http_response(status, headers, body)
169        };
170        crate::protocol_serde::type_erase_result(parse_result)
171    }
172}
173#[derive(Debug)]
174struct CreateBucketRequestSerializer;
175impl ::aws_smithy_runtime_api::client::ser_de::SerializeRequest for CreateBucketRequestSerializer {
176    #[allow(unused_mut, clippy::let_and_return, clippy::needless_borrow, clippy::useless_conversion)]
177    fn serialize_input(
178        &self,
179        input: ::aws_smithy_runtime_api::client::interceptors::context::Input,
180        _cfg: &mut ::aws_smithy_types::config_bag::ConfigBag,
181    ) -> ::std::result::Result<::aws_smithy_runtime_api::client::orchestrator::HttpRequest, ::aws_smithy_runtime_api::box_error::BoxError> {
182        let input = input
183            .downcast::<crate::operation::create_bucket::CreateBucketInput>()
184            .expect("correct type");
185        let _header_serialization_settings = _cfg
186            .load::<crate::serialization_settings::HeaderSerializationSettings>()
187            .cloned()
188            .unwrap_or_default();
189        let mut request_builder = {
190            fn uri_base(
191                _input: &crate::operation::create_bucket::CreateBucketInput,
192                output: &mut ::std::string::String,
193            ) -> ::std::result::Result<(), ::aws_smithy_types::error::operation::BuildError> {
194                use ::std::fmt::Write as _;
195                ::std::write!(output, "/").expect("formatting should succeed");
196                ::std::result::Result::Ok(())
197            }
198            #[allow(clippy::unnecessary_wraps)]
199            fn update_http_builder(
200                input: &crate::operation::create_bucket::CreateBucketInput,
201                builder: ::http::request::Builder,
202            ) -> ::std::result::Result<::http::request::Builder, ::aws_smithy_types::error::operation::BuildError> {
203                let mut uri = ::std::string::String::new();
204                uri_base(input, &mut uri)?;
205                let builder = crate::protocol_serde::shape_create_bucket::ser_create_bucket_headers(input, builder)?;
206                ::std::result::Result::Ok(builder.method("PUT").uri(uri))
207            }
208            let mut builder = update_http_builder(&input, ::http::request::Builder::new())?;
209            builder = _header_serialization_settings.set_default_header(builder, ::http::header::CONTENT_TYPE, "application/xml");
210            builder
211        };
212        let body = ::aws_smithy_types::body::SdkBody::from(
213            crate::protocol_serde::shape_create_bucket_input::ser_create_bucket_configuration_http_payload(&input.create_bucket_configuration)?,
214        );
215        if let Some(content_length) = body.content_length() {
216            let content_length = content_length.to_string();
217            request_builder = _header_serialization_settings.set_default_header(request_builder, ::http::header::CONTENT_LENGTH, &content_length);
218        }
219        ::std::result::Result::Ok(request_builder.body(body).expect("valid request").try_into().unwrap())
220    }
221}
222#[derive(Debug)]
223struct CreateBucketEndpointParamsInterceptor;
224
225impl ::aws_smithy_runtime_api::client::interceptors::Intercept for CreateBucketEndpointParamsInterceptor {
226    fn name(&self) -> &'static str {
227        "CreateBucketEndpointParamsInterceptor"
228    }
229
230    fn read_before_execution(
231        &self,
232        context: &::aws_smithy_runtime_api::client::interceptors::context::BeforeSerializationInterceptorContextRef<
233            '_,
234            ::aws_smithy_runtime_api::client::interceptors::context::Input,
235            ::aws_smithy_runtime_api::client::interceptors::context::Output,
236            ::aws_smithy_runtime_api::client::interceptors::context::Error,
237        >,
238        cfg: &mut ::aws_smithy_types::config_bag::ConfigBag,
239    ) -> ::std::result::Result<(), ::aws_smithy_runtime_api::box_error::BoxError> {
240        let _input = context
241            .input()
242            .downcast_ref::<CreateBucketInput>()
243            .ok_or("failed to downcast to CreateBucketInput")?;
244
245        let params = crate::config::endpoint::Params::builder()
246            .set_region(cfg.load::<::aws_types::region::Region>().map(|r| r.as_ref().to_owned()))
247            .set_use_fips(cfg.load::<::aws_types::endpoint_config::UseFips>().map(|ty| ty.0))
248            .set_use_dual_stack(cfg.load::<::aws_types::endpoint_config::UseDualStack>().map(|ty| ty.0))
249            .set_endpoint(cfg.load::<::aws_types::endpoint_config::EndpointUrl>().map(|ty| ty.0.clone()))
250            .set_force_path_style(cfg.load::<crate::config::ForcePathStyle>().map(|ty| ty.0))
251            .set_use_arn_region(cfg.load::<crate::config::UseArnRegion>().map(|ty| ty.0))
252            .set_disable_multi_region_access_points(cfg.load::<crate::config::DisableMultiRegionAccessPoints>().map(|ty| ty.0))
253            .set_accelerate(cfg.load::<crate::config::Accelerate>().map(|ty| ty.0))
254            .set_disable_s3_express_session_auth(cfg.load::<crate::config::DisableS3ExpressSessionAuth>().map(|ty| ty.0))
255            .set_use_s3_express_control_endpoint(Some(true))
256            .set_disable_access_points(Some(true))
257            .set_bucket(Some(
258                _input
259                    .bucket
260                    .clone()
261                    .filter(|f| !AsRef::<str>::as_ref(f).trim().is_empty())
262                    .ok_or_else(|| ::aws_smithy_types::error::operation::BuildError::missing_field("bucket", "A required field was not set"))?,
263            ))
264            .build()
265            .map_err(|err| {
266                ::aws_smithy_runtime_api::client::interceptors::error::ContextAttachedError::new("endpoint params could not be built", err)
267            })?;
268        cfg.interceptor_state()
269            .store_put(::aws_smithy_runtime_api::client::endpoint::EndpointResolverParams::new(params));
270        ::std::result::Result::Ok(())
271    }
272}
273
274// The get_* functions below are generated from JMESPath expressions in the
275// operationContextParams trait. They target the operation's input shape.
276
277/// Error type for the `CreateBucketError` operation.
278#[non_exhaustive]
279#[derive(::std::fmt::Debug)]
280pub enum CreateBucketError {
281    /// <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>
282    BucketAlreadyExists(crate::types::error::BucketAlreadyExists),
283    /// <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>
284    BucketAlreadyOwnedByYou(crate::types::error::BucketAlreadyOwnedByYou),
285    /// An unexpected error occurred (e.g., invalid JSON returned by the service or an unknown error code).
286    #[deprecated(note = "Matching `Unhandled` directly is not forwards compatible. Instead, match using a \
287    variable wildcard pattern and check `.code()`:
288     \
289    &nbsp;&nbsp;&nbsp;`err if err.code() == Some(\"SpecificExceptionCode\") => { /* handle the error */ }`
290     \
291    See [`ProvideErrorMetadata`](#impl-ProvideErrorMetadata-for-CreateBucketError) for what information is available for the error.")]
292    Unhandled(crate::error::sealed_unhandled::Unhandled),
293}
294impl CreateBucketError {
295    /// Creates the `CreateBucketError::Unhandled` variant from any error type.
296    pub fn unhandled(
297        err: impl ::std::convert::Into<::std::boxed::Box<dyn ::std::error::Error + ::std::marker::Send + ::std::marker::Sync + 'static>>,
298    ) -> Self {
299        Self::Unhandled(crate::error::sealed_unhandled::Unhandled {
300            source: err.into(),
301            meta: ::std::default::Default::default(),
302        })
303    }
304
305    /// Creates the `CreateBucketError::Unhandled` variant from an [`ErrorMetadata`](::aws_smithy_types::error::ErrorMetadata).
306    pub fn generic(err: ::aws_smithy_types::error::ErrorMetadata) -> Self {
307        Self::Unhandled(crate::error::sealed_unhandled::Unhandled {
308            source: err.clone().into(),
309            meta: err,
310        })
311    }
312    ///
313    /// Returns error metadata, which includes the error code, message,
314    /// request ID, and potentially additional information.
315    ///
316    pub fn meta(&self) -> &::aws_smithy_types::error::ErrorMetadata {
317        match self {
318            Self::BucketAlreadyExists(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
319            Self::BucketAlreadyOwnedByYou(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
320            Self::Unhandled(e) => &e.meta,
321        }
322    }
323    /// Returns `true` if the error kind is `CreateBucketError::BucketAlreadyExists`.
324    pub fn is_bucket_already_exists(&self) -> bool {
325        matches!(self, Self::BucketAlreadyExists(_))
326    }
327    /// Returns `true` if the error kind is `CreateBucketError::BucketAlreadyOwnedByYou`.
328    pub fn is_bucket_already_owned_by_you(&self) -> bool {
329        matches!(self, Self::BucketAlreadyOwnedByYou(_))
330    }
331}
332impl ::std::error::Error for CreateBucketError {
333    fn source(&self) -> ::std::option::Option<&(dyn ::std::error::Error + 'static)> {
334        match self {
335            Self::BucketAlreadyExists(_inner) => ::std::option::Option::Some(_inner),
336            Self::BucketAlreadyOwnedByYou(_inner) => ::std::option::Option::Some(_inner),
337            Self::Unhandled(_inner) => ::std::option::Option::Some(&*_inner.source),
338        }
339    }
340}
341impl ::std::fmt::Display for CreateBucketError {
342    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
343        match self {
344            Self::BucketAlreadyExists(_inner) => _inner.fmt(f),
345            Self::BucketAlreadyOwnedByYou(_inner) => _inner.fmt(f),
346            Self::Unhandled(_inner) => {
347                if let ::std::option::Option::Some(code) = ::aws_smithy_types::error::metadata::ProvideErrorMetadata::code(self) {
348                    write!(f, "unhandled error ({code})")
349                } else {
350                    f.write_str("unhandled error")
351                }
352            }
353        }
354    }
355}
356impl ::aws_smithy_types::retry::ProvideErrorKind for CreateBucketError {
357    fn code(&self) -> ::std::option::Option<&str> {
358        ::aws_smithy_types::error::metadata::ProvideErrorMetadata::code(self)
359    }
360    fn retryable_error_kind(&self) -> ::std::option::Option<::aws_smithy_types::retry::ErrorKind> {
361        ::std::option::Option::None
362    }
363}
364impl ::aws_smithy_types::error::metadata::ProvideErrorMetadata for CreateBucketError {
365    fn meta(&self) -> &::aws_smithy_types::error::ErrorMetadata {
366        match self {
367            Self::BucketAlreadyExists(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
368            Self::BucketAlreadyOwnedByYou(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
369            Self::Unhandled(_inner) => &_inner.meta,
370        }
371    }
372}
373impl ::aws_smithy_runtime_api::client::result::CreateUnhandledError for CreateBucketError {
374    fn create_unhandled_error(
375        source: ::std::boxed::Box<dyn ::std::error::Error + ::std::marker::Send + ::std::marker::Sync + 'static>,
376        meta: ::std::option::Option<::aws_smithy_types::error::ErrorMetadata>,
377    ) -> Self {
378        Self::Unhandled(crate::error::sealed_unhandled::Unhandled {
379            source,
380            meta: meta.unwrap_or_default(),
381        })
382    }
383}
384impl crate::s3_request_id::RequestIdExt for crate::operation::create_bucket::CreateBucketError {
385    fn extended_request_id(&self) -> Option<&str> {
386        self.meta().extended_request_id()
387    }
388}
389impl ::aws_types::request_id::RequestId for crate::operation::create_bucket::CreateBucketError {
390    fn request_id(&self) -> Option<&str> {
391        self.meta().request_id()
392    }
393}
394
395pub use crate::operation::create_bucket::_create_bucket_output::CreateBucketOutput;
396
397pub use crate::operation::create_bucket::_create_bucket_input::CreateBucketInput;
398
399mod _create_bucket_input;
400
401mod _create_bucket_output;
402
403/// Builders
404pub mod builders;