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