aws_sdk_s3/operation/
put_object.rs

1// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
2/// Orchestration and serialization glue logic for `PutObject`.
3#[derive(::std::clone::Clone, ::std::default::Default, ::std::fmt::Debug)]
4#[non_exhaustive]
5pub struct PutObject;
6impl PutObject {
7    /// Creates a new `PutObject`
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::put_object::PutObjectInput,
14    ) -> ::std::result::Result<
15        crate::operation::put_object::PutObjectOutput,
16        ::aws_smithy_runtime_api::client::result::SdkError<
17            crate::operation::put_object::PutObjectError,
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::put_object::PutObjectError>()
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::put_object::PutObjectOutput>()
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::put_object::PutObjectInput,
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", "PutObject", 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 PutObject {
85    fn config(&self) -> ::std::option::Option<::aws_smithy_types::config_bag::FrozenLayer> {
86        let mut cfg = ::aws_smithy_types::config_bag::Layer::new("PutObject");
87
88        cfg.store_put(::aws_smithy_runtime_api::client::ser_de::SharedRequestSerializer::new(
89            PutObjectRequestSerializer,
90        ));
91        cfg.store_put(::aws_smithy_runtime_api::client::ser_de::SharedResponseDeserializer::new(
92            PutObjectResponseDeserializer,
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::SensitiveOutput);
100        cfg.store_put(::aws_smithy_runtime_api::client::orchestrator::Metadata::new("PutObject", "s3"));
101        let mut signing_options = ::aws_runtime::auth::SigningOptions::default();
102        signing_options.double_uri_encode = false;
103        signing_options.content_sha256_header = true;
104        signing_options.normalize_uri_path = false;
105        signing_options.payload_override = None;
106
107        cfg.store_put(::aws_runtime::auth::SigV4OperationSigningConfig {
108            signing_options,
109            ..::std::default::Default::default()
110        });
111
112        ::std::option::Option::Some(cfg.freeze())
113    }
114
115    fn runtime_components(
116        &self,
117        _: &::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder,
118    ) -> ::std::borrow::Cow<'_, ::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder> {
119        #[allow(unused_mut)]
120        let mut rcb = ::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder::new("PutObject")
121            .with_interceptor(::aws_smithy_runtime::client::stalled_stream_protection::StalledStreamProtectionInterceptor::default())
122            .with_interceptor(PutObjectEndpointParamsInterceptor)
123            .with_interceptor(crate::http_request_checksum::RequestChecksumInterceptor::new(
124                |input: &::aws_smithy_runtime_api::client::interceptors::context::Input| {
125                    let input: &crate::operation::put_object::PutObjectInput = input.downcast_ref().expect("correct type");
126                    let checksum_algorithm = input.checksum_algorithm();
127                    let checksum_algorithm = checksum_algorithm.map(|algorithm| algorithm.as_str());
128                    let checksum_algorithm = match checksum_algorithm {
129                        Some(algo) => Some(
130                            algo.parse::<::aws_smithy_checksums::ChecksumAlgorithm>()
131                                .map_err(::aws_smithy_types::error::operation::BuildError::other)?,
132                        ),
133                        None => None,
134                    };
135                    ::std::result::Result::<_, ::aws_smithy_runtime_api::box_error::BoxError>::Ok(checksum_algorithm)
136                },
137            ))
138            .with_retry_classifier(::aws_smithy_runtime::client::retries::classifiers::TransientErrorClassifier::<
139                crate::operation::put_object::PutObjectError,
140            >::new())
141            .with_retry_classifier(::aws_smithy_runtime::client::retries::classifiers::ModeledAsRetryableClassifier::<
142                crate::operation::put_object::PutObjectError,
143            >::new())
144            .with_retry_classifier(
145                ::aws_runtime::retries::classifiers::AwsErrorCodeClassifier::<crate::operation::put_object::PutObjectError>::builder()
146                    .transient_errors({
147                        let mut transient_errors: Vec<&'static str> = ::aws_runtime::retries::classifiers::TRANSIENT_ERRORS.into();
148                        transient_errors.push("InternalError");
149                        ::std::borrow::Cow::Owned(transient_errors)
150                    })
151                    .build(),
152            );
153
154        ::std::borrow::Cow::Owned(rcb)
155    }
156}
157
158#[derive(Debug)]
159struct PutObjectResponseDeserializer;
160impl ::aws_smithy_runtime_api::client::ser_de::DeserializeResponse for PutObjectResponseDeserializer {
161    fn deserialize_nonstreaming(
162        &self,
163        response: &::aws_smithy_runtime_api::client::orchestrator::HttpResponse,
164    ) -> ::aws_smithy_runtime_api::client::interceptors::context::OutputOrError {
165        let (success, status) = (response.status().is_success(), response.status().as_u16());
166        let headers = response.headers();
167        let body = response.body().bytes().expect("body loaded");
168        #[allow(unused_mut)]
169        let mut force_error = false;
170        ::tracing::debug!(extended_request_id = ?crate::s3_request_id::RequestIdExt::extended_request_id(response));
171        if matches!(crate::rest_xml_unwrapped_errors::body_is_error(body), Ok(true)) {
172            force_error = true;
173        }
174        ::tracing::debug!(request_id = ?::aws_types::request_id::RequestId::request_id(response));
175        let parse_result = if !success && status != 200 || force_error {
176            crate::protocol_serde::shape_put_object::de_put_object_http_error(status, headers, body)
177        } else {
178            crate::protocol_serde::shape_put_object::de_put_object_http_response(status, headers, body)
179        };
180        crate::protocol_serde::type_erase_result(parse_result)
181    }
182}
183#[derive(Debug)]
184struct PutObjectRequestSerializer;
185impl ::aws_smithy_runtime_api::client::ser_de::SerializeRequest for PutObjectRequestSerializer {
186    #[allow(unused_mut, clippy::let_and_return, clippy::needless_borrow, clippy::useless_conversion)]
187    fn serialize_input(
188        &self,
189        input: ::aws_smithy_runtime_api::client::interceptors::context::Input,
190        _cfg: &mut ::aws_smithy_types::config_bag::ConfigBag,
191    ) -> ::std::result::Result<::aws_smithy_runtime_api::client::orchestrator::HttpRequest, ::aws_smithy_runtime_api::box_error::BoxError> {
192        let input = input.downcast::<crate::operation::put_object::PutObjectInput>().expect("correct type");
193        let _header_serialization_settings = _cfg
194            .load::<crate::serialization_settings::HeaderSerializationSettings>()
195            .cloned()
196            .unwrap_or_default();
197        let mut request_builder = {
198            fn uri_base(
199                _input: &crate::operation::put_object::PutObjectInput,
200                output: &mut ::std::string::String,
201            ) -> ::std::result::Result<(), ::aws_smithy_types::error::operation::BuildError> {
202                use ::std::fmt::Write as _;
203                let input_1 = &_input.key;
204                let input_1 = input_1
205                    .as_ref()
206                    .ok_or_else(|| ::aws_smithy_types::error::operation::BuildError::missing_field("key", "cannot be empty or unset"))?;
207                let key = ::aws_smithy_http::label::fmt_string(input_1, ::aws_smithy_http::label::EncodingStrategy::Greedy);
208                if key.is_empty() {
209                    return ::std::result::Result::Err(::aws_smithy_types::error::operation::BuildError::missing_field(
210                        "key",
211                        "cannot be empty or unset",
212                    ));
213                }
214                ::std::write!(output, "/{Key}", Key = key).expect("formatting should succeed");
215                ::std::result::Result::Ok(())
216            }
217            fn uri_query(
218                _input: &crate::operation::put_object::PutObjectInput,
219                mut output: &mut ::std::string::String,
220            ) -> ::std::result::Result<(), ::aws_smithy_types::error::operation::BuildError> {
221                let mut query = ::aws_smithy_http::query::Writer::new(output);
222                query.push_kv("x-id", "PutObject");
223                ::std::result::Result::Ok(())
224            }
225            #[allow(clippy::unnecessary_wraps)]
226            fn update_http_builder(
227                input: &crate::operation::put_object::PutObjectInput,
228                builder: ::http::request::Builder,
229            ) -> ::std::result::Result<::http::request::Builder, ::aws_smithy_types::error::operation::BuildError> {
230                let mut uri = ::std::string::String::new();
231                uri_base(input, &mut uri)?;
232                uri_query(input, &mut uri)?;
233                let builder = crate::protocol_serde::shape_put_object::ser_put_object_headers(input, builder)?;
234                ::std::result::Result::Ok(builder.method("PUT").uri(uri))
235            }
236            let mut builder = update_http_builder(&input, ::http::request::Builder::new())?;
237            builder = _header_serialization_settings.set_default_header(builder, ::http::header::CONTENT_TYPE, "application/octet-stream");
238            builder
239        };
240        let body = crate::protocol_serde::shape_put_object_input::ser_body_http_payload(input.body)?.into_inner();
241        if let Some(content_length) = body.content_length() {
242            let content_length = content_length.to_string();
243            request_builder = _header_serialization_settings.set_default_header(request_builder, ::http::header::CONTENT_LENGTH, &content_length);
244        }
245        ::std::result::Result::Ok(request_builder.body(body).expect("valid request").try_into().unwrap())
246    }
247}
248#[derive(Debug)]
249struct PutObjectEndpointParamsInterceptor;
250
251impl ::aws_smithy_runtime_api::client::interceptors::Intercept for PutObjectEndpointParamsInterceptor {
252    fn name(&self) -> &'static str {
253        "PutObjectEndpointParamsInterceptor"
254    }
255
256    fn read_before_execution(
257        &self,
258        context: &::aws_smithy_runtime_api::client::interceptors::context::BeforeSerializationInterceptorContextRef<
259            '_,
260            ::aws_smithy_runtime_api::client::interceptors::context::Input,
261            ::aws_smithy_runtime_api::client::interceptors::context::Output,
262            ::aws_smithy_runtime_api::client::interceptors::context::Error,
263        >,
264        cfg: &mut ::aws_smithy_types::config_bag::ConfigBag,
265    ) -> ::std::result::Result<(), ::aws_smithy_runtime_api::box_error::BoxError> {
266        let _input = context
267            .input()
268            .downcast_ref::<PutObjectInput>()
269            .ok_or("failed to downcast to PutObjectInput")?;
270
271        let params = crate::config::endpoint::Params::builder()
272            .set_region(cfg.load::<::aws_types::region::Region>().map(|r| r.as_ref().to_owned()))
273            .set_use_fips(cfg.load::<::aws_types::endpoint_config::UseFips>().map(|ty| ty.0))
274            .set_use_dual_stack(cfg.load::<::aws_types::endpoint_config::UseDualStack>().map(|ty| ty.0))
275            .set_endpoint(cfg.load::<::aws_types::endpoint_config::EndpointUrl>().map(|ty| ty.0.clone()))
276            .set_force_path_style(cfg.load::<crate::config::ForcePathStyle>().map(|ty| ty.0))
277            .set_use_arn_region(cfg.load::<crate::config::UseArnRegion>().map(|ty| ty.0))
278            .set_disable_multi_region_access_points(cfg.load::<crate::config::DisableMultiRegionAccessPoints>().map(|ty| ty.0))
279            .set_accelerate(cfg.load::<crate::config::Accelerate>().map(|ty| ty.0))
280            .set_disable_s3_express_session_auth(cfg.load::<crate::config::DisableS3ExpressSessionAuth>().map(|ty| ty.0))
281            .set_bucket(Some(
282                _input
283                    .bucket
284                    .clone()
285                    .filter(|f| !AsRef::<str>::as_ref(f).trim().is_empty())
286                    .ok_or_else(|| ::aws_smithy_types::error::operation::BuildError::missing_field("bucket", "A required field was not set"))?,
287            ))
288            .set_key(Some(
289                _input
290                    .key
291                    .clone()
292                    .filter(|f| !AsRef::<str>::as_ref(f).trim().is_empty())
293                    .ok_or_else(|| ::aws_smithy_types::error::operation::BuildError::missing_field("key", "A required field was not set"))?,
294            ))
295            .build()
296            .map_err(|err| {
297                ::aws_smithy_runtime_api::client::interceptors::error::ContextAttachedError::new("endpoint params could not be built", err)
298            })?;
299        cfg.interceptor_state()
300            .store_put(::aws_smithy_runtime_api::client::endpoint::EndpointResolverParams::new(params));
301        ::std::result::Result::Ok(())
302    }
303}
304
305// The get_* functions below are generated from JMESPath expressions in the
306// operationContextParams trait. They target the operation's input shape.
307
308#[allow(unreachable_code, unused_variables)]
309#[cfg(test)]
310mod put_object_test {
311
312    /// This test validates that if a content-type is specified, that only one content-type header is sent
313    /// Test ID: DontSendDuplicateContentType
314    #[::tokio::test]
315    #[::tracing_test::traced_test]
316    async fn dont_send_duplicate_content_type_request() {
317        let (http_client, request_receiver) = ::aws_smithy_runtime::client::http::test_util::capture_request(None);
318        let config_builder = crate::config::Config::builder().with_test_defaults().endpoint_url("https://example.com");
319        let config_builder = config_builder.region(::aws_types::region::Region::new("us-east-1"));
320        let mut config_builder = config_builder;
321        config_builder.set_region(Some(crate::config::Region::new("us-east-1")));
322
323        let config = config_builder.http_client(http_client).build();
324        let client = crate::Client::from_conf(config);
325        let result = client
326            .put_object()
327            .set_bucket(::std::option::Option::Some("test-bucket".to_owned()))
328            .set_key(::std::option::Option::Some("test-key".to_owned()))
329            .set_content_type(::std::option::Option::Some("text/html".to_owned()))
330            .send()
331            .await;
332        let _ = dbg!(result);
333        let http_request = request_receiver.expect_request();
334        let expected_headers = [("content-type", "text/html")];
335        ::aws_smithy_protocol_test::assert_ok(::aws_smithy_protocol_test::validate_headers(http_request.headers(), expected_headers));
336        let uri: ::http::Uri = http_request.uri().parse().expect("invalid URI sent");
337        ::pretty_assertions::assert_eq!(http_request.method(), "PUT", "method was incorrect");
338        ::pretty_assertions::assert_eq!(uri.path(), "/test-key", "path was incorrect");
339    }
340
341    /// This test validates that if a content-length is specified, that only one content-length header is sent
342    /// Test ID: DontSendDuplicateContentLength
343    #[::tokio::test]
344    #[::tracing_test::traced_test]
345    async fn dont_send_duplicate_content_length_request() {
346        let (http_client, request_receiver) = ::aws_smithy_runtime::client::http::test_util::capture_request(None);
347        let config_builder = crate::config::Config::builder().with_test_defaults().endpoint_url("https://example.com");
348        let config_builder = config_builder.region(::aws_types::region::Region::new("us-east-1"));
349        let mut config_builder = config_builder;
350        config_builder.set_region(Some(crate::config::Region::new("us-east-1")));
351
352        let config = config_builder.http_client(http_client).build();
353        let client = crate::Client::from_conf(config);
354        let result = client
355            .put_object()
356            .set_bucket(::std::option::Option::Some("test-bucket".to_owned()))
357            .set_key(::std::option::Option::Some("test-key".to_owned()))
358            .set_content_length(::std::option::Option::Some(2))
359            .set_body(::std::option::Option::Some(::aws_smithy_types::byte_stream::ByteStream::from_static(
360                b"ab",
361            )))
362            .send()
363            .await;
364        let _ = dbg!(result);
365        let http_request = request_receiver.expect_request();
366        let expected_headers = [("content-length", "2")];
367        ::aws_smithy_protocol_test::assert_ok(::aws_smithy_protocol_test::validate_headers(http_request.headers(), expected_headers));
368        let uri: ::http::Uri = http_request.uri().parse().expect("invalid URI sent");
369        ::pretty_assertions::assert_eq!(http_request.method(), "PUT", "method was incorrect");
370        ::pretty_assertions::assert_eq!(uri.path(), "/test-key", "path was incorrect");
371    }
372}
373
374/// Error type for the `PutObjectError` operation.
375#[non_exhaustive]
376#[derive(::std::fmt::Debug)]
377pub enum PutObjectError {
378    /// <p>The existing object was created with a different encryption type. Subsequent write requests must include the appropriate encryption parameters in the request or while creating the session.</p>
379    EncryptionTypeMismatch(crate::types::error::EncryptionTypeMismatch),
380    /// <p>You may receive this error in multiple cases. Depending on the reason for the error, you may receive one of the messages below:</p>
381    /// <ul>
382    /// <li>
383    /// <p>Cannot specify both a write offset value and user-defined object metadata for existing objects.</p></li>
384    /// <li>
385    /// <p>Checksum Type mismatch occurred, expected checksum Type: sha1, actual checksum Type: crc32c.</p></li>
386    /// <li>
387    /// <p>Request body cannot be empty when 'write offset' is specified.</p></li>
388    /// </ul>
389    InvalidRequest(crate::types::error::InvalidRequest),
390    /// <p>The write offset value that you specified does not match the current object size.</p>
391    InvalidWriteOffset(crate::types::error::InvalidWriteOffset),
392    /// <p>You have attempted to add more parts than the maximum of 10000 that are allowed for this object. You can use the CopyObject operation to copy this object to another and then add more data to the newly copied object.</p>
393    TooManyParts(crate::types::error::TooManyParts),
394    /// An unexpected error occurred (e.g., invalid JSON returned by the service or an unknown error code).
395    #[deprecated(note = "Matching `Unhandled` directly is not forwards compatible. Instead, match using a \
396    variable wildcard pattern and check `.code()`:
397     \
398    &nbsp;&nbsp;&nbsp;`err if err.code() == Some(\"SpecificExceptionCode\") => { /* handle the error */ }`
399     \
400    See [`ProvideErrorMetadata`](#impl-ProvideErrorMetadata-for-PutObjectError) for what information is available for the error.")]
401    Unhandled(crate::error::sealed_unhandled::Unhandled),
402}
403impl PutObjectError {
404    /// Creates the `PutObjectError::Unhandled` variant from any error type.
405    pub fn unhandled(
406        err: impl ::std::convert::Into<::std::boxed::Box<dyn ::std::error::Error + ::std::marker::Send + ::std::marker::Sync + 'static>>,
407    ) -> Self {
408        Self::Unhandled(crate::error::sealed_unhandled::Unhandled {
409            source: err.into(),
410            meta: ::std::default::Default::default(),
411        })
412    }
413
414    /// Creates the `PutObjectError::Unhandled` variant from an [`ErrorMetadata`](::aws_smithy_types::error::ErrorMetadata).
415    pub fn generic(err: ::aws_smithy_types::error::ErrorMetadata) -> Self {
416        Self::Unhandled(crate::error::sealed_unhandled::Unhandled {
417            source: err.clone().into(),
418            meta: err,
419        })
420    }
421    ///
422    /// Returns error metadata, which includes the error code, message,
423    /// request ID, and potentially additional information.
424    ///
425    pub fn meta(&self) -> &::aws_smithy_types::error::ErrorMetadata {
426        match self {
427            Self::EncryptionTypeMismatch(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
428            Self::InvalidRequest(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
429            Self::InvalidWriteOffset(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
430            Self::TooManyParts(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
431            Self::Unhandled(e) => &e.meta,
432        }
433    }
434    /// Returns `true` if the error kind is `PutObjectError::EncryptionTypeMismatch`.
435    pub fn is_encryption_type_mismatch(&self) -> bool {
436        matches!(self, Self::EncryptionTypeMismatch(_))
437    }
438    /// Returns `true` if the error kind is `PutObjectError::InvalidRequest`.
439    pub fn is_invalid_request(&self) -> bool {
440        matches!(self, Self::InvalidRequest(_))
441    }
442    /// Returns `true` if the error kind is `PutObjectError::InvalidWriteOffset`.
443    pub fn is_invalid_write_offset(&self) -> bool {
444        matches!(self, Self::InvalidWriteOffset(_))
445    }
446    /// Returns `true` if the error kind is `PutObjectError::TooManyParts`.
447    pub fn is_too_many_parts(&self) -> bool {
448        matches!(self, Self::TooManyParts(_))
449    }
450}
451impl ::std::error::Error for PutObjectError {
452    fn source(&self) -> ::std::option::Option<&(dyn ::std::error::Error + 'static)> {
453        match self {
454            Self::EncryptionTypeMismatch(_inner) => ::std::option::Option::Some(_inner),
455            Self::InvalidRequest(_inner) => ::std::option::Option::Some(_inner),
456            Self::InvalidWriteOffset(_inner) => ::std::option::Option::Some(_inner),
457            Self::TooManyParts(_inner) => ::std::option::Option::Some(_inner),
458            Self::Unhandled(_inner) => ::std::option::Option::Some(&*_inner.source),
459        }
460    }
461}
462impl ::std::fmt::Display for PutObjectError {
463    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
464        match self {
465            Self::EncryptionTypeMismatch(_inner) => _inner.fmt(f),
466            Self::InvalidRequest(_inner) => _inner.fmt(f),
467            Self::InvalidWriteOffset(_inner) => _inner.fmt(f),
468            Self::TooManyParts(_inner) => _inner.fmt(f),
469            Self::Unhandled(_inner) => {
470                if let ::std::option::Option::Some(code) = ::aws_smithy_types::error::metadata::ProvideErrorMetadata::code(self) {
471                    write!(f, "unhandled error ({code})")
472                } else {
473                    f.write_str("unhandled error")
474                }
475            }
476        }
477    }
478}
479impl ::aws_smithy_types::retry::ProvideErrorKind for PutObjectError {
480    fn code(&self) -> ::std::option::Option<&str> {
481        ::aws_smithy_types::error::metadata::ProvideErrorMetadata::code(self)
482    }
483    fn retryable_error_kind(&self) -> ::std::option::Option<::aws_smithy_types::retry::ErrorKind> {
484        ::std::option::Option::None
485    }
486}
487impl ::aws_smithy_types::error::metadata::ProvideErrorMetadata for PutObjectError {
488    fn meta(&self) -> &::aws_smithy_types::error::ErrorMetadata {
489        match self {
490            Self::EncryptionTypeMismatch(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
491            Self::InvalidRequest(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
492            Self::InvalidWriteOffset(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
493            Self::TooManyParts(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
494            Self::Unhandled(_inner) => &_inner.meta,
495        }
496    }
497}
498impl ::aws_smithy_runtime_api::client::result::CreateUnhandledError for PutObjectError {
499    fn create_unhandled_error(
500        source: ::std::boxed::Box<dyn ::std::error::Error + ::std::marker::Send + ::std::marker::Sync + 'static>,
501        meta: ::std::option::Option<::aws_smithy_types::error::ErrorMetadata>,
502    ) -> Self {
503        Self::Unhandled(crate::error::sealed_unhandled::Unhandled {
504            source,
505            meta: meta.unwrap_or_default(),
506        })
507    }
508}
509impl crate::s3_request_id::RequestIdExt for crate::operation::put_object::PutObjectError {
510    fn extended_request_id(&self) -> Option<&str> {
511        self.meta().extended_request_id()
512    }
513}
514impl ::aws_types::request_id::RequestId for crate::operation::put_object::PutObjectError {
515    fn request_id(&self) -> Option<&str> {
516        self.meta().request_id()
517    }
518}
519
520pub use crate::operation::put_object::_put_object_output::PutObjectOutput;
521
522pub use crate::operation::put_object::_put_object_input::PutObjectInput;
523
524mod _put_object_input;
525
526mod _put_object_output;
527
528/// Builders
529pub mod builders;