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