Skip to main content

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