aws_sdk_dynamodb/operation/
scan.rs

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