aws_sdk_dynamodb/operation/
batch_get_item.rs

1// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
2/// Orchestration and serialization glue logic for `BatchGetItem`.
3#[derive(::std::clone::Clone, ::std::default::Default, ::std::fmt::Debug)]
4#[non_exhaustive]
5pub struct BatchGetItem;
6impl BatchGetItem {
7    /// Creates a new `BatchGetItem`
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::batch_get_item::BatchGetItemInput,
14                    ) -> ::std::result::Result<crate::operation::batch_get_item::BatchGetItemOutput, ::aws_smithy_runtime_api::client::result::SdkError<crate::operation::batch_get_item::BatchGetItemError, ::aws_smithy_runtime_api::client::orchestrator::HttpResponse>> {
15                        let map_err = |err: ::aws_smithy_runtime_api::client::result::SdkError<::aws_smithy_runtime_api::client::interceptors::context::Error, ::aws_smithy_runtime_api::client::orchestrator::HttpResponse>| {
16                            err.map_service_error(|err| {
17                                err.downcast::<crate::operation::batch_get_item::BatchGetItemError>().expect("correct error type")
18                            })
19                        };
20                        let context = Self::orchestrate_with_stop_point(runtime_plugins, input, ::aws_smithy_runtime::client::orchestrator::StopPoint::None)
21                            .await
22                            .map_err(map_err)?;
23                        let output = context.finalize().map_err(map_err)?;
24                        ::std::result::Result::Ok(output.downcast::<crate::operation::batch_get_item::BatchGetItemOutput>().expect("correct output type"))
25                    }
26    
27                    pub(crate) async fn orchestrate_with_stop_point(
28                        runtime_plugins: &::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins,
29                        input: crate::operation::batch_get_item::BatchGetItemInput,
30                        stop_point: ::aws_smithy_runtime::client::orchestrator::StopPoint,
31                    ) -> ::std::result::Result<::aws_smithy_runtime_api::client::interceptors::context::InterceptorContext, ::aws_smithy_runtime_api::client::result::SdkError<::aws_smithy_runtime_api::client::interceptors::context::Error, ::aws_smithy_runtime_api::client::orchestrator::HttpResponse>> {
32                        let input = ::aws_smithy_runtime_api::client::interceptors::context::Input::erase(input);
33                        use ::tracing::Instrument;
34                        ::aws_smithy_runtime::client::orchestrator::invoke_with_stop_point(
35                            "DynamoDB",
36                            "BatchGetItem",
37                            input,
38                            runtime_plugins,
39                            stop_point
40                        )
41                        // Create a parent span for the entire operation. Includes a random, internal-only,
42                        // seven-digit ID for the operation orchestration so that it can be correlated in the logs.
43                        .instrument(::tracing::debug_span!(
44                                "DynamoDB.BatchGetItem",
45                                "rpc.service" = "DynamoDB",
46                                "rpc.method" = "BatchGetItem",
47                                "sdk_invocation_id" = ::fastrand::u32(1_000_000..10_000_000),
48                                "rpc.system" = "aws-api",
49                            ))
50                        .await
51                    }
52    
53                    pub(crate) fn operation_runtime_plugins(
54                        client_runtime_plugins: ::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins,
55                        client_config: &crate::config::Config,
56                        config_override: ::std::option::Option<crate::config::Builder>,
57                    ) -> ::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins {
58                        let mut runtime_plugins = client_runtime_plugins.with_operation_plugin(Self::new());
59                        runtime_plugins = runtime_plugins
60                                        .with_client_plugin(crate::auth_plugin::DefaultAuthOptionsPlugin::new(vec![::aws_runtime::auth::sigv4::SCHEME_ID]));
61                        if let ::std::option::Option::Some(config_override) = config_override {
62                            for plugin in config_override.runtime_plugins.iter().cloned() {
63                                runtime_plugins = runtime_plugins.with_operation_plugin(plugin);
64                            }
65                            runtime_plugins = runtime_plugins.with_operation_plugin(
66                                crate::config::ConfigOverrideRuntimePlugin::new(config_override, client_config.config.clone(), &client_config.runtime_components)
67                            );
68                        }
69                        runtime_plugins
70                    }
71}
72impl ::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin for BatchGetItem {
73                fn config(&self) -> ::std::option::Option<::aws_smithy_types::config_bag::FrozenLayer> {
74                    let mut cfg = ::aws_smithy_types::config_bag::Layer::new("BatchGetItem");
75
76                    cfg.store_put(::aws_smithy_runtime_api::client::ser_de::SharedRequestSerializer::new(BatchGetItemRequestSerializer));
77                    cfg.store_put(::aws_smithy_runtime_api::client::ser_de::SharedResponseDeserializer::new(BatchGetItemResponseDeserializer));
78
79                    
80                    cfg.store_put(::aws_smithy_runtime_api::client::auth::AuthSchemeOptionResolverParams::new(::aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolverParams::new()));
81
82                    cfg.store_put(::aws_smithy_runtime_api::client::orchestrator::Metadata::new(
83                            "BatchGetItem",
84                            "DynamoDB",
85                        ));
86let mut signing_options = ::aws_runtime::auth::SigningOptions::default();
87                            signing_options.double_uri_encode = true;
88                            signing_options.content_sha256_header = false;
89                            signing_options.normalize_uri_path = true;
90                            signing_options.payload_override = None;
91
92                            cfg.store_put(::aws_runtime::auth::SigV4OperationSigningConfig {
93                                signing_options,
94                                ..::std::default::Default::default()
95                            });
96
97                    ::std::option::Option::Some(cfg.freeze())
98                }
99
100                fn runtime_components(&self, _: &::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder) -> ::std::borrow::Cow<'_, ::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder> {
101                    #[allow(unused_mut)]
102                    let mut rcb = ::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder::new("BatchGetItem")
103                            .with_interceptor(::aws_smithy_runtime::client::stalled_stream_protection::StalledStreamProtectionInterceptor::default())
104.with_interceptor(BatchGetItemEndpointParamsInterceptor)
105                            .with_retry_classifier(::aws_smithy_runtime::client::retries::classifiers::TransientErrorClassifier::<crate::operation::batch_get_item::BatchGetItemError>::new())
106.with_retry_classifier(::aws_smithy_runtime::client::retries::classifiers::ModeledAsRetryableClassifier::<crate::operation::batch_get_item::BatchGetItemError>::new())
107.with_retry_classifier(::aws_runtime::retries::classifiers::AwsErrorCodeClassifier::<crate::operation::batch_get_item::BatchGetItemError>::new());
108
109                    ::std::borrow::Cow::Owned(rcb)
110                }
111            }
112
113            
114#[derive(Debug)]
115            struct BatchGetItemResponseDeserializer;
116            impl ::aws_smithy_runtime_api::client::ser_de::DeserializeResponse for BatchGetItemResponseDeserializer {
117                
118
119                fn deserialize_nonstreaming(&self, response: &::aws_smithy_runtime_api::client::orchestrator::HttpResponse) -> ::aws_smithy_runtime_api::client::interceptors::context::OutputOrError {
120                    let (success, status) = (response.status().is_success(), response.status().as_u16());
121            let headers = response.headers();
122            let body = response.body().bytes().expect("body loaded");
123            #[allow(unused_mut)]
124            let mut force_error = false;
125            ::tracing::debug!(request_id = ?::aws_types::request_id::RequestId::request_id(response));
126            let parse_result = if !success && status != 200 || force_error {
127                crate::protocol_serde::shape_batch_get_item::de_batch_get_item_http_error(status, headers, body)
128            } else {
129                crate::protocol_serde::shape_batch_get_item::de_batch_get_item_http_response(status, headers, body)
130            };
131            crate::protocol_serde::type_erase_result(parse_result)
132                }
133            }
134#[derive(Debug)]
135            struct BatchGetItemRequestSerializer;
136            impl ::aws_smithy_runtime_api::client::ser_de::SerializeRequest for BatchGetItemRequestSerializer {
137                #[allow(unused_mut, clippy::let_and_return, clippy::needless_borrow, clippy::useless_conversion)]
138                fn serialize_input(&self, input: ::aws_smithy_runtime_api::client::interceptors::context::Input, _cfg: &mut ::aws_smithy_types::config_bag::ConfigBag) -> ::std::result::Result<::aws_smithy_runtime_api::client::orchestrator::HttpRequest, ::aws_smithy_runtime_api::box_error::BoxError> {
139                    let input = input.downcast::<crate::operation::batch_get_item::BatchGetItemInput>().expect("correct type");
140                    let _header_serialization_settings = _cfg.load::<crate::serialization_settings::HeaderSerializationSettings>().cloned().unwrap_or_default();
141                    let mut request_builder = {
142                        fn uri_base(_input: &crate::operation::batch_get_item::BatchGetItemInput, output: &mut ::std::string::String) -> ::std::result::Result<(), ::aws_smithy_types::error::operation::BuildError> {
143    use ::std::fmt::Write as _;
144    ::std::write!(output, "/").expect("formatting should succeed");
145    ::std::result::Result::Ok(())
146}
147#[allow(clippy::unnecessary_wraps)]
148fn update_http_builder(
149                input: &crate::operation::batch_get_item::BatchGetItemInput,
150                builder: ::http::request::Builder
151            ) -> ::std::result::Result<::http::request::Builder, ::aws_smithy_types::error::operation::BuildError> {
152    let mut uri = ::std::string::String::new();
153    uri_base(input, &mut uri)?;
154    ::std::result::Result::Ok(builder.method("POST").uri(uri))
155}
156let mut builder = update_http_builder(&input, ::http::request::Builder::new())?;
157builder = _header_serialization_settings.set_default_header(builder, ::http::header::CONTENT_TYPE, "application/x-amz-json-1.0");
158builder = _header_serialization_settings.set_default_header(
159                        builder,
160                        ::http::header::HeaderName::from_static("x-amz-target"),
161                        "DynamoDB_20120810.BatchGetItem"
162                    );
163builder
164                    };
165                    let body = ::aws_smithy_types::body::SdkBody::from(crate::protocol_serde::shape_batch_get_item::ser_batch_get_item_input(&input)?);
166                    if let Some(content_length) = body.content_length() {
167                                let content_length = content_length.to_string();
168                                request_builder = _header_serialization_settings.set_default_header(request_builder, ::http::header::CONTENT_LENGTH, &content_length);
169                            }
170                    ::std::result::Result::Ok(request_builder.body(body).expect("valid request").try_into().unwrap())
171                }
172            }
173#[derive(Debug)]
174            struct BatchGetItemEndpointParamsInterceptor;
175
176            impl ::aws_smithy_runtime_api::client::interceptors::Intercept for BatchGetItemEndpointParamsInterceptor {
177                fn name(&self) -> &'static str {
178                    "BatchGetItemEndpointParamsInterceptor"
179                }
180
181                fn read_before_execution(
182                    &self,
183                    context: &::aws_smithy_runtime_api::client::interceptors::context::BeforeSerializationInterceptorContextRef<'_, ::aws_smithy_runtime_api::client::interceptors::context::Input, ::aws_smithy_runtime_api::client::interceptors::context::Output, ::aws_smithy_runtime_api::client::interceptors::context::Error>,
184                    cfg: &mut ::aws_smithy_types::config_bag::ConfigBag,
185                ) -> ::std::result::Result<(), ::aws_smithy_runtime_api::box_error::BoxError> {
186                    let _input = context.input()
187                        .downcast_ref::<BatchGetItemInput>()
188                        .ok_or("failed to downcast to BatchGetItemInput")?;
189
190                    
191
192                    let params = crate::config::endpoint::Params::builder()
193                        .set_region(cfg.load::<::aws_types::region::Region>().map(|r|r.as_ref().to_owned()))
194.set_use_dual_stack(cfg.load::<::aws_types::endpoint_config::UseDualStack>().map(|ty| ty.0))
195.set_use_fips(cfg.load::<::aws_types::endpoint_config::UseFips>().map(|ty| ty.0))
196.set_endpoint(cfg.load::<::aws_types::endpoint_config::EndpointUrl>().map(|ty| ty.0.clone()))
197.set_account_id_endpoint_mode(::std::option::Option::Some(cfg.load::<::aws_types::endpoint_config::AccountIdEndpointMode>().cloned().unwrap_or_default().to_string()))
198.set_resource_arn_list(get_resource_arn_list(_input))
199                        .build()
200                        .map_err(|err| ::aws_smithy_runtime_api::client::interceptors::error::ContextAttachedError::new("endpoint params could not be built", err))?;
201                    cfg.interceptor_state().store_put(::aws_smithy_runtime_api::client::endpoint::EndpointResolverParams::new(params));
202                    ::std::result::Result::Ok(())
203                }
204            }
205
206            // The get_* functions below are generated from JMESPath expressions in the
207            // operationContextParams trait. They target the operation's input shape.
208
209            // Generated from JMESPath Expression: keys(RequestItems)
210fn get_resource_arn_list(input: &crate::operation::batch_get_item::BatchGetItemInput) -> Option<::std::vec::Vec::<::std::string::String>> {
211    let _fld_2 = input.request_items.as_ref()?;
212    let _ret_1 = _fld_2.keys().map(Clone::clone).collect::<Vec<String>>();
213    Some(_ret_1)
214}
215
216/// Error type for the `BatchGetItemError` operation.
217#[non_exhaustive]
218#[derive(::std::fmt::Debug)]
219pub enum BatchGetItemError {
220    /// <p>An error occurred on the server side.</p>
221    InternalServerError(crate::types::error::InternalServerError),
222    #[allow(missing_docs)] // documentation missing in model
223    InvalidEndpointException(crate::types::error::InvalidEndpointException),
224    /// <p>Your request rate is too high. The Amazon Web Services SDKs for DynamoDB automatically retry requests that receive this exception. Your request is eventually successful, unless your retry queue is too large to finish. Reduce the frequency of requests and use exponential backoff. For more information, go to <a href="https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.RetryAndBackoff">Error Retries and Exponential Backoff</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>
225    ProvisionedThroughputExceededException(crate::types::error::ProvisionedThroughputExceededException),
226    /// <p>Throughput exceeds the current throughput quota for your account. Please contact <a href="https://aws.amazon.com/support">Amazon Web ServicesSupport</a> to request a quota increase.</p>
227    RequestLimitExceeded(crate::types::error::RequestLimitExceeded),
228    /// <p>The operation tried to access a nonexistent table or index. The resource might not be specified correctly, or its status might not be <code>ACTIVE</code>.</p>
229    ResourceNotFoundException(crate::types::error::ResourceNotFoundException),
230    /// An unexpected error occurred (e.g., invalid JSON returned by the service or an unknown error code).
231                    #[deprecated(note = "Matching `Unhandled` directly is not forwards compatible. Instead, match using a \
232    variable wildcard pattern and check `.code()`:
233     \
234    &nbsp;&nbsp;&nbsp;`err if err.code() == Some(\"SpecificExceptionCode\") => { /* handle the error */ }`
235     \
236    See [`ProvideErrorMetadata`](#impl-ProvideErrorMetadata-for-BatchGetItemError) for what information is available for the error.")]
237                    Unhandled(crate::error::sealed_unhandled::Unhandled),
238}
239impl BatchGetItemError {
240    /// Creates the `BatchGetItemError::Unhandled` variant from any error type.
241                    pub fn unhandled(err: impl ::std::convert::Into<::std::boxed::Box<dyn ::std::error::Error + ::std::marker::Send + ::std::marker::Sync + 'static>>) -> Self {
242                        Self::Unhandled(crate::error::sealed_unhandled::Unhandled { source: err.into(), meta: ::std::default::Default::default() })
243                    }
244    
245                    /// Creates the `BatchGetItemError::Unhandled` variant from an [`ErrorMetadata`](::aws_smithy_types::error::ErrorMetadata).
246                    pub fn generic(err: ::aws_smithy_types::error::ErrorMetadata) -> Self {
247                        Self::Unhandled(crate::error::sealed_unhandled::Unhandled { source: err.clone().into(), meta: err })
248                    }
249    /// 
250    /// Returns error metadata, which includes the error code, message,
251    /// request ID, and potentially additional information.
252    /// 
253    pub fn meta(&self) -> &::aws_smithy_types::error::ErrorMetadata {
254        match self {
255            Self::InternalServerError(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
256            Self::InvalidEndpointException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
257            Self::ProvisionedThroughputExceededException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
258            Self::RequestLimitExceeded(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
259            Self::ResourceNotFoundException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
260            Self::Unhandled(e) => &e.meta,
261        }
262    }
263    /// Returns `true` if the error kind is `BatchGetItemError::InternalServerError`.
264    pub fn is_internal_server_error(&self) -> bool {
265        matches!(self, Self::InternalServerError(_))
266    }
267    /// Returns `true` if the error kind is `BatchGetItemError::InvalidEndpointException`.
268    pub fn is_invalid_endpoint_exception(&self) -> bool {
269        matches!(self, Self::InvalidEndpointException(_))
270    }
271    /// Returns `true` if the error kind is `BatchGetItemError::ProvisionedThroughputExceededException`.
272    pub fn is_provisioned_throughput_exceeded_exception(&self) -> bool {
273        matches!(self, Self::ProvisionedThroughputExceededException(_))
274    }
275    /// Returns `true` if the error kind is `BatchGetItemError::RequestLimitExceeded`.
276    pub fn is_request_limit_exceeded(&self) -> bool {
277        matches!(self, Self::RequestLimitExceeded(_))
278    }
279    /// Returns `true` if the error kind is `BatchGetItemError::ResourceNotFoundException`.
280    pub fn is_resource_not_found_exception(&self) -> bool {
281        matches!(self, Self::ResourceNotFoundException(_))
282    }
283}
284impl ::std::error::Error for BatchGetItemError {
285    fn source(&self) -> ::std::option::Option<&(dyn ::std::error::Error + 'static)> {
286        match self {
287            Self::InternalServerError(_inner) =>
288            ::std::option::Option::Some(_inner)
289            ,
290            Self::InvalidEndpointException(_inner) =>
291            ::std::option::Option::Some(_inner)
292            ,
293            Self::ProvisionedThroughputExceededException(_inner) =>
294            ::std::option::Option::Some(_inner)
295            ,
296            Self::RequestLimitExceeded(_inner) =>
297            ::std::option::Option::Some(_inner)
298            ,
299            Self::ResourceNotFoundException(_inner) =>
300            ::std::option::Option::Some(_inner)
301            ,
302            Self::Unhandled(_inner) => {
303                ::std::option::Option::Some(&*_inner.source)
304            }
305        }
306    }
307}
308impl ::std::fmt::Display for BatchGetItemError {
309    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
310        match self {
311            Self::InternalServerError(_inner) =>
312            _inner.fmt(f)
313            ,
314            Self::InvalidEndpointException(_inner) =>
315            _inner.fmt(f)
316            ,
317            Self::ProvisionedThroughputExceededException(_inner) =>
318            _inner.fmt(f)
319            ,
320            Self::RequestLimitExceeded(_inner) =>
321            _inner.fmt(f)
322            ,
323            Self::ResourceNotFoundException(_inner) =>
324            _inner.fmt(f)
325            ,
326            Self::Unhandled(_inner) => {
327                if let ::std::option::Option::Some(code) = ::aws_smithy_types::error::metadata::ProvideErrorMetadata::code(self) {
328                                                        write!(f, "unhandled error ({code})")
329                                                    } else {
330                                                        f.write_str("unhandled error")
331                                                    }
332            }
333        }
334    }
335}
336impl ::aws_smithy_types::retry::ProvideErrorKind for BatchGetItemError {
337    fn code(&self) -> ::std::option::Option<&str> {
338        ::aws_smithy_types::error::metadata::ProvideErrorMetadata::code(self)
339    }
340    fn retryable_error_kind(&self) -> ::std::option::Option<::aws_smithy_types::retry::ErrorKind> {
341        ::std::option::Option::None
342    }
343}
344impl ::aws_smithy_types::error::metadata::ProvideErrorMetadata for BatchGetItemError {
345    fn meta(&self) -> &::aws_smithy_types::error::ErrorMetadata {
346        match self {
347            Self::InternalServerError(_inner) =>
348            ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner)
349            ,
350            Self::InvalidEndpointException(_inner) =>
351            ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner)
352            ,
353            Self::ProvisionedThroughputExceededException(_inner) =>
354            ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner)
355            ,
356            Self::RequestLimitExceeded(_inner) =>
357            ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner)
358            ,
359            Self::ResourceNotFoundException(_inner) =>
360            ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner)
361            ,
362            Self::Unhandled(_inner) => {
363                &_inner.meta
364            }
365        }
366    }
367}
368impl ::aws_smithy_runtime_api::client::result::CreateUnhandledError for BatchGetItemError {
369    fn create_unhandled_error(
370                        source: ::std::boxed::Box<dyn ::std::error::Error + ::std::marker::Send + ::std::marker::Sync + 'static>,
371                        meta: ::std::option::Option<::aws_smithy_types::error::ErrorMetadata>
372                    ) -> Self {
373        Self::Unhandled(crate::error::sealed_unhandled::Unhandled { source, meta: meta.unwrap_or_default() })
374    }
375}
376impl ::aws_types::request_id::RequestId for crate::operation::batch_get_item::BatchGetItemError {
377                                fn request_id(&self) -> Option<&str> {
378                                    self.meta().request_id()
379                                }
380                            }
381
382pub use crate::operation::batch_get_item::_batch_get_item_output::BatchGetItemOutput;
383
384pub use crate::operation::batch_get_item::_batch_get_item_input::BatchGetItemInput;
385
386mod _batch_get_item_input;
387
388mod _batch_get_item_output;
389
390/// Builders
391pub mod builders;
392