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            #[allow(clippy::uninlined_format_args)]
191            fn uri_base(
192                _input: &crate::operation::create_bucket::CreateBucketInput,
193                output: &mut ::std::string::String,
194            ) -> ::std::result::Result<(), ::aws_smithy_types::error::operation::BuildError> {
195                use ::std::fmt::Write as _;
196                ::std::write!(output, "/").expect("formatting should succeed");
197                ::std::result::Result::Ok(())
198            }
199            #[allow(clippy::unnecessary_wraps)]
200            fn update_http_builder(
201                input: &crate::operation::create_bucket::CreateBucketInput,
202                builder: ::http::request::Builder,
203            ) -> ::std::result::Result<::http::request::Builder, ::aws_smithy_types::error::operation::BuildError> {
204                let mut uri = ::std::string::String::new();
205                uri_base(input, &mut uri)?;
206                let builder = crate::protocol_serde::shape_create_bucket::ser_create_bucket_headers(input, builder)?;
207                ::std::result::Result::Ok(builder.method("PUT").uri(uri))
208            }
209            let mut builder = update_http_builder(&input, ::http::request::Builder::new())?;
210            builder = _header_serialization_settings.set_default_header(builder, ::http::header::CONTENT_TYPE, "application/xml");
211            builder
212        };
213        let body = ::aws_smithy_types::body::SdkBody::from(
214            crate::protocol_serde::shape_create_bucket_input::ser_create_bucket_configuration_http_payload(&input.create_bucket_configuration)?,
215        );
216        if let Some(content_length) = body.content_length() {
217            let content_length = content_length.to_string();
218            request_builder = _header_serialization_settings.set_default_header(request_builder, ::http::header::CONTENT_LENGTH, &content_length);
219        }
220        ::std::result::Result::Ok(request_builder.body(body).expect("valid request").try_into().unwrap())
221    }
222}
223#[derive(Debug)]
224struct CreateBucketEndpointParamsInterceptor;
225
226impl ::aws_smithy_runtime_api::client::interceptors::Intercept for CreateBucketEndpointParamsInterceptor {
227    fn name(&self) -> &'static str {
228        "CreateBucketEndpointParamsInterceptor"
229    }
230
231    fn read_before_execution(
232        &self,
233        context: &::aws_smithy_runtime_api::client::interceptors::context::BeforeSerializationInterceptorContextRef<
234            '_,
235            ::aws_smithy_runtime_api::client::interceptors::context::Input,
236            ::aws_smithy_runtime_api::client::interceptors::context::Output,
237            ::aws_smithy_runtime_api::client::interceptors::context::Error,
238        >,
239        cfg: &mut ::aws_smithy_types::config_bag::ConfigBag,
240    ) -> ::std::result::Result<(), ::aws_smithy_runtime_api::box_error::BoxError> {
241        let _input = context
242            .input()
243            .downcast_ref::<CreateBucketInput>()
244            .ok_or("failed to downcast to CreateBucketInput")?;
245
246        let params = crate::config::endpoint::Params::builder()
247            .set_region(cfg.load::<::aws_types::region::Region>().map(|r| r.as_ref().to_owned()))
248            .set_use_fips(cfg.load::<::aws_types::endpoint_config::UseFips>().map(|ty| ty.0))
249            .set_use_dual_stack(cfg.load::<::aws_types::endpoint_config::UseDualStack>().map(|ty| ty.0))
250            .set_endpoint(cfg.load::<::aws_types::endpoint_config::EndpointUrl>().map(|ty| ty.0.clone()))
251            .set_force_path_style(cfg.load::<crate::config::ForcePathStyle>().map(|ty| ty.0))
252            .set_use_arn_region(cfg.load::<crate::config::UseArnRegion>().map(|ty| ty.0))
253            .set_disable_multi_region_access_points(cfg.load::<crate::config::DisableMultiRegionAccessPoints>().map(|ty| ty.0))
254            .set_accelerate(cfg.load::<crate::config::Accelerate>().map(|ty| ty.0))
255            .set_disable_s3_express_session_auth(cfg.load::<crate::config::DisableS3ExpressSessionAuth>().map(|ty| ty.0))
256            .set_use_s3_express_control_endpoint(Some(true))
257            .set_disable_access_points(Some(true))
258            .set_bucket(Some(
259                _input
260                    .bucket
261                    .clone()
262                    .filter(|f| !AsRef::<str>::as_ref(f).trim().is_empty())
263                    .ok_or_else(|| ::aws_smithy_types::error::operation::BuildError::missing_field("bucket", "A required field was not set"))?,
264            ))
265            .build()
266            .map_err(|err| {
267                ::aws_smithy_runtime_api::client::interceptors::error::ContextAttachedError::new("endpoint params could not be built", err)
268            })?;
269        cfg.interceptor_state()
270            .store_put(::aws_smithy_runtime_api::client::endpoint::EndpointResolverParams::new(params));
271        ::std::result::Result::Ok(())
272    }
273}
274
275// The get_* functions below are generated from JMESPath expressions in the
276// operationContextParams trait. They target the operation's input shape.
277
278/// Error type for the `CreateBucketError` operation.
279#[non_exhaustive]
280#[derive(::std::fmt::Debug)]
281pub enum CreateBucketError {
282    /// <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>
283    BucketAlreadyExists(crate::types::error::BucketAlreadyExists),
284    /// <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>
285    BucketAlreadyOwnedByYou(crate::types::error::BucketAlreadyOwnedByYou),
286    /// An unexpected error occurred (e.g., invalid JSON returned by the service or an unknown error code).
287    #[deprecated(note = "Matching `Unhandled` directly is not forwards compatible. Instead, match using a \
288    variable wildcard pattern and check `.code()`:
289     \
290    &nbsp;&nbsp;&nbsp;`err if err.code() == Some(\"SpecificExceptionCode\") => { /* handle the error */ }`
291     \
292    See [`ProvideErrorMetadata`](#impl-ProvideErrorMetadata-for-CreateBucketError) for what information is available for the error.")]
293    Unhandled(crate::error::sealed_unhandled::Unhandled),
294}
295impl CreateBucketError {
296    /// Creates the `CreateBucketError::Unhandled` variant from any error type.
297    pub fn unhandled(
298        err: impl ::std::convert::Into<::std::boxed::Box<dyn ::std::error::Error + ::std::marker::Send + ::std::marker::Sync + 'static>>,
299    ) -> Self {
300        Self::Unhandled(crate::error::sealed_unhandled::Unhandled {
301            source: err.into(),
302            meta: ::std::default::Default::default(),
303        })
304    }
305
306    /// Creates the `CreateBucketError::Unhandled` variant from an [`ErrorMetadata`](::aws_smithy_types::error::ErrorMetadata).
307    pub fn generic(err: ::aws_smithy_types::error::ErrorMetadata) -> Self {
308        Self::Unhandled(crate::error::sealed_unhandled::Unhandled {
309            source: err.clone().into(),
310            meta: err,
311        })
312    }
313    ///
314    /// Returns error metadata, which includes the error code, message,
315    /// request ID, and potentially additional information.
316    ///
317    pub fn meta(&self) -> &::aws_smithy_types::error::ErrorMetadata {
318        match self {
319            Self::BucketAlreadyExists(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
320            Self::BucketAlreadyOwnedByYou(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
321            Self::Unhandled(e) => &e.meta,
322        }
323    }
324    /// Returns `true` if the error kind is `CreateBucketError::BucketAlreadyExists`.
325    pub fn is_bucket_already_exists(&self) -> bool {
326        matches!(self, Self::BucketAlreadyExists(_))
327    }
328    /// Returns `true` if the error kind is `CreateBucketError::BucketAlreadyOwnedByYou`.
329    pub fn is_bucket_already_owned_by_you(&self) -> bool {
330        matches!(self, Self::BucketAlreadyOwnedByYou(_))
331    }
332}
333impl ::std::error::Error for CreateBucketError {
334    fn source(&self) -> ::std::option::Option<&(dyn ::std::error::Error + 'static)> {
335        match self {
336            Self::BucketAlreadyExists(_inner) => ::std::option::Option::Some(_inner),
337            Self::BucketAlreadyOwnedByYou(_inner) => ::std::option::Option::Some(_inner),
338            Self::Unhandled(_inner) => ::std::option::Option::Some(&*_inner.source),
339        }
340    }
341}
342impl ::std::fmt::Display for CreateBucketError {
343    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
344        match self {
345            Self::BucketAlreadyExists(_inner) => _inner.fmt(f),
346            Self::BucketAlreadyOwnedByYou(_inner) => _inner.fmt(f),
347            Self::Unhandled(_inner) => {
348                if let ::std::option::Option::Some(code) = ::aws_smithy_types::error::metadata::ProvideErrorMetadata::code(self) {
349                    write!(f, "unhandled error ({code})")
350                } else {
351                    f.write_str("unhandled error")
352                }
353            }
354        }
355    }
356}
357impl ::aws_smithy_types::retry::ProvideErrorKind for CreateBucketError {
358    fn code(&self) -> ::std::option::Option<&str> {
359        ::aws_smithy_types::error::metadata::ProvideErrorMetadata::code(self)
360    }
361    fn retryable_error_kind(&self) -> ::std::option::Option<::aws_smithy_types::retry::ErrorKind> {
362        ::std::option::Option::None
363    }
364}
365impl ::aws_smithy_types::error::metadata::ProvideErrorMetadata for CreateBucketError {
366    fn meta(&self) -> &::aws_smithy_types::error::ErrorMetadata {
367        match self {
368            Self::BucketAlreadyExists(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
369            Self::BucketAlreadyOwnedByYou(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
370            Self::Unhandled(_inner) => &_inner.meta,
371        }
372    }
373}
374impl ::aws_smithy_runtime_api::client::result::CreateUnhandledError for CreateBucketError {
375    fn create_unhandled_error(
376        source: ::std::boxed::Box<dyn ::std::error::Error + ::std::marker::Send + ::std::marker::Sync + 'static>,
377        meta: ::std::option::Option<::aws_smithy_types::error::ErrorMetadata>,
378    ) -> Self {
379        Self::Unhandled(crate::error::sealed_unhandled::Unhandled {
380            source,
381            meta: meta.unwrap_or_default(),
382        })
383    }
384}
385impl crate::s3_request_id::RequestIdExt for crate::operation::create_bucket::CreateBucketError {
386    fn extended_request_id(&self) -> Option<&str> {
387        self.meta().extended_request_id()
388    }
389}
390impl ::aws_types::request_id::RequestId for crate::operation::create_bucket::CreateBucketError {
391    fn request_id(&self) -> Option<&str> {
392        self.meta().request_id()
393    }
394}
395
396pub use crate::operation::create_bucket::_create_bucket_output::CreateBucketOutput;
397
398pub use crate::operation::create_bucket::_create_bucket_input::CreateBucketInput;
399
400mod _create_bucket_input;
401
402mod _create_bucket_output;
403
404/// Builders
405pub mod builders;