Skip to main content

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