Skip to main content

aws_sdk_textract/operation/
start_document_analysis.rs

1// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
2/// Orchestration and serialization glue logic for `StartDocumentAnalysis`.
3#[derive(::std::clone::Clone, ::std::default::Default, ::std::fmt::Debug)]
4#[non_exhaustive]
5pub struct StartDocumentAnalysis;
6impl StartDocumentAnalysis {
7    /// Creates a new `StartDocumentAnalysis`
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::start_document_analysis::StartDocumentAnalysisInput,
14    ) -> ::std::result::Result<
15        crate::operation::start_document_analysis::StartDocumentAnalysisOutput,
16        ::aws_smithy_runtime_api::client::result::SdkError<
17            crate::operation::start_document_analysis::StartDocumentAnalysisError,
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::start_document_analysis::StartDocumentAnalysisError>()
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::start_document_analysis::StartDocumentAnalysisOutput>()
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::start_document_analysis::StartDocumentAnalysisInput,
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("Textract", "StartDocumentAnalysis", 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                "Textract.StartDocumentAnalysis",
59                "rpc.service" = "Textract",
60                "rpc.method" = "StartDocumentAnalysis",
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 StartDocumentAnalysis {
88    fn config(&self) -> ::std::option::Option<::aws_smithy_types::config_bag::FrozenLayer> {
89        let mut cfg = ::aws_smithy_types::config_bag::Layer::new("StartDocumentAnalysis");
90
91        cfg.store_put(::aws_smithy_runtime_api::client::ser_de::SharedRequestSerializer::new(
92            StartDocumentAnalysisRequestSerializer,
93        ));
94        cfg.store_put(::aws_smithy_runtime_api::client::ser_de::SharedResponseDeserializer::new(
95            StartDocumentAnalysisResponseDeserializer,
96        ));
97
98        cfg.store_put(::aws_smithy_runtime_api::client::auth::AuthSchemeOptionResolverParams::new(
99            crate::config::auth::Params::builder()
100                .operation_name("StartDocumentAnalysis")
101                .build()
102                .expect("required fields set"),
103        ));
104
105        cfg.store_put(::aws_smithy_runtime_api::client::orchestrator::Metadata::new(
106            "StartDocumentAnalysis",
107            "Textract",
108        ));
109        let mut signing_options = ::aws_runtime::auth::SigningOptions::default();
110        signing_options.double_uri_encode = true;
111        signing_options.content_sha256_header = false;
112        signing_options.normalize_uri_path = true;
113        signing_options.payload_override = None;
114
115        cfg.store_put(::aws_runtime::auth::SigV4OperationSigningConfig {
116            signing_options,
117            ..::std::default::Default::default()
118        });
119
120        ::std::option::Option::Some(cfg.freeze())
121    }
122
123    fn runtime_components(
124        &self,
125        _: &::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder,
126    ) -> ::std::borrow::Cow<'_, ::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder> {
127        #[allow(unused_mut)]
128        let mut rcb = ::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder::new("StartDocumentAnalysis")
129            .with_interceptor(::aws_smithy_runtime_api::client::interceptors::SharedInterceptor::permanent(
130                StartDocumentAnalysisTelemetryInputCaptureInterceptor,
131            ))
132            .with_interceptor(::aws_smithy_runtime_api::client::interceptors::SharedInterceptor::permanent(
133                ::aws_smithy_runtime::client::stalled_stream_protection::StalledStreamProtectionInterceptor::default(),
134            ))
135            .with_interceptor(::aws_smithy_runtime_api::client::interceptors::SharedInterceptor::permanent(
136                StartDocumentAnalysisEndpointParamsInterceptor,
137            ))
138            .with_retry_classifier(::aws_smithy_runtime::client::retries::classifiers::TransientErrorClassifier::<
139                crate::operation::start_document_analysis::StartDocumentAnalysisError,
140            >::new())
141            .with_retry_classifier(::aws_smithy_runtime::client::retries::classifiers::ModeledAsRetryableClassifier::<
142                crate::operation::start_document_analysis::StartDocumentAnalysisError,
143            >::new())
144            .with_retry_classifier(::aws_runtime::retries::classifiers::AwsErrorCodeClassifier::<
145                crate::operation::start_document_analysis::StartDocumentAnalysisError,
146            >::new());
147
148        ::std::borrow::Cow::Owned(rcb)
149    }
150}
151
152#[derive(Debug)]
153struct StartDocumentAnalysisTelemetryInputCaptureInterceptor;
154
155#[::aws_smithy_runtime_api::client::interceptors::dyn_dispatch_hint]
156impl ::aws_smithy_runtime_api::client::interceptors::Intercept for StartDocumentAnalysisTelemetryInputCaptureInterceptor {
157    fn name(&self) -> &'static str {
158        "StartDocumentAnalysisTelemetryInputCaptureInterceptor"
159    }
160
161    fn read_before_execution(
162        &self,
163        context: &::aws_smithy_runtime_api::client::interceptors::context::BeforeSerializationInterceptorContextRef<
164            '_,
165            ::aws_smithy_runtime_api::client::interceptors::context::Input,
166            ::aws_smithy_runtime_api::client::interceptors::context::Output,
167            ::aws_smithy_runtime_api::client::interceptors::context::Error,
168        >,
169        cfg: &mut ::aws_smithy_types::config_bag::ConfigBag,
170    ) -> ::std::result::Result<(), ::aws_smithy_runtime_api::box_error::BoxError> {
171        // Nothing to do unless the customer opted in by naming members to record.
172        let ::std::option::Option::Some(requested) = cfg
173            .load::<::aws_smithy_types::telemetry::RequestedTelemetryAttributes>()
174            .filter(|r| !r.is_empty())
175        else {
176            return ::std::result::Result::Ok(());
177        };
178
179        let ::std::option::Option::Some(input) = context.input().downcast_ref::<StartDocumentAnalysisInput>() else {
180            // A mismatched input is not this interceptor's concern; skip quietly.
181            return ::std::result::Result::Ok(());
182        };
183
184        let mut captured = ::aws_smithy_types::telemetry::CapturedTelemetryAttributes::default();
185        if requested.should_capture("ClientRequestToken") {
186            if let ::std::option::Option::Some(value) = input.client_request_token.as_deref() {
187                captured.insert("ClientRequestToken", value);
188            }
189        }
190        if requested.should_capture("JobTag") {
191            if let ::std::option::Option::Some(value) = input.job_tag.as_deref() {
192                captured.insert("JobTag", value);
193            }
194        }
195        if requested.should_capture("KMSKeyId") {
196            if let ::std::option::Option::Some(value) = input.kms_key_id.as_deref() {
197                captured.insert("KMSKeyId", value);
198            }
199        }
200
201        cfg.interceptor_state().store_put(captured);
202        ::std::result::Result::Ok(())
203    }
204}
205#[derive(Debug)]
206struct StartDocumentAnalysisResponseDeserializer;
207impl ::aws_smithy_runtime_api::client::ser_de::DeserializeResponse for StartDocumentAnalysisResponseDeserializer {
208    fn deserialize_nonstreaming_with_config(
209        &self,
210        response: &::aws_smithy_runtime_api::client::orchestrator::HttpResponse,
211        _cfg: &::aws_smithy_types::config_bag::ConfigBag,
212    ) -> ::aws_smithy_runtime_api::client::interceptors::context::OutputOrError {
213        let (success, status) = (response.status().is_success(), response.status().as_u16());
214        let headers = response.headers();
215        let body = response.body().bytes().expect("body loaded");
216        #[allow(unused_mut)]
217        let mut force_error = false;
218        ::tracing::debug!(request_id = ?::aws_types::request_id::RequestId::request_id(response));
219        let parse_result = if !success && status != 200 || force_error {
220            crate::protocol_serde::shape_start_document_analysis::de_start_document_analysis_http_error(status, headers, body)
221        } else {
222            crate::protocol_serde::shape_start_document_analysis::de_start_document_analysis_http_response(status, headers, body)
223        };
224        crate::protocol_serde::type_erase_result(parse_result)
225    }
226}
227#[derive(Debug)]
228struct StartDocumentAnalysisRequestSerializer;
229impl ::aws_smithy_runtime_api::client::ser_de::SerializeRequest for StartDocumentAnalysisRequestSerializer {
230    #[allow(unused_mut, clippy::let_and_return, clippy::needless_borrow, clippy::useless_conversion)]
231    fn serialize_input(
232        &self,
233        input: ::aws_smithy_runtime_api::client::interceptors::context::Input,
234        _cfg: &mut ::aws_smithy_types::config_bag::ConfigBag,
235    ) -> ::std::result::Result<::aws_smithy_runtime_api::client::orchestrator::HttpRequest, ::aws_smithy_runtime_api::box_error::BoxError> {
236        let input = input
237            .downcast::<crate::operation::start_document_analysis::StartDocumentAnalysisInput>()
238            .expect("correct type");
239        let _header_serialization_settings = _cfg
240            .load::<crate::serialization_settings::HeaderSerializationSettings>()
241            .cloned()
242            .unwrap_or_default();
243        let mut request_builder = {
244            #[allow(clippy::uninlined_format_args)]
245            fn uri_base(
246                _input: &crate::operation::start_document_analysis::StartDocumentAnalysisInput,
247                output: &mut ::std::string::String,
248            ) -> ::std::result::Result<(), ::aws_smithy_types::error::operation::BuildError> {
249                use ::std::fmt::Write as _;
250                ::std::write!(output, "/").expect("formatting should succeed");
251                ::std::result::Result::Ok(())
252            }
253            #[allow(clippy::unnecessary_wraps)]
254            fn update_http_builder(
255                input: &crate::operation::start_document_analysis::StartDocumentAnalysisInput,
256                builder: ::http_1x::request::Builder,
257            ) -> ::std::result::Result<::http_1x::request::Builder, ::aws_smithy_types::error::operation::BuildError> {
258                let mut uri = ::std::string::String::new();
259                uri_base(input, &mut uri)?;
260                ::std::result::Result::Ok(builder.method("POST").uri(uri))
261            }
262            let mut builder = update_http_builder(&input, ::http_1x::request::Builder::new())?;
263            builder = _header_serialization_settings.set_default_header(builder, ::http_1x::header::CONTENT_TYPE, "application/x-amz-json-1.1");
264            builder = _header_serialization_settings.set_default_header(
265                builder,
266                ::http_1x::header::HeaderName::from_static("x-amz-target"),
267                "Textract.StartDocumentAnalysis",
268            );
269            builder
270        };
271        let body = ::aws_smithy_types::body::SdkBody::from(crate::protocol_serde::shape_start_document_analysis::ser_start_document_analysis_input(
272            &input,
273        )?);
274        if let Some(content_length) = body.content_length() {
275            let content_length = content_length.to_string();
276            request_builder = _header_serialization_settings.set_default_header(request_builder, ::http_1x::header::CONTENT_LENGTH, &content_length);
277        }
278        ::std::result::Result::Ok(request_builder.body(body).expect("valid request").try_into().unwrap())
279    }
280}
281#[derive(Debug)]
282struct StartDocumentAnalysisEndpointParamsInterceptor;
283
284#[::aws_smithy_runtime_api::client::interceptors::dyn_dispatch_hint]
285impl ::aws_smithy_runtime_api::client::interceptors::Intercept for StartDocumentAnalysisEndpointParamsInterceptor {
286    fn name(&self) -> &'static str {
287        "StartDocumentAnalysisEndpointParamsInterceptor"
288    }
289
290    fn read_before_execution(
291        &self,
292        context: &::aws_smithy_runtime_api::client::interceptors::context::BeforeSerializationInterceptorContextRef<
293            '_,
294            ::aws_smithy_runtime_api::client::interceptors::context::Input,
295            ::aws_smithy_runtime_api::client::interceptors::context::Output,
296            ::aws_smithy_runtime_api::client::interceptors::context::Error,
297        >,
298        cfg: &mut ::aws_smithy_types::config_bag::ConfigBag,
299    ) -> ::std::result::Result<(), ::aws_smithy_runtime_api::box_error::BoxError> {
300        let _input = context
301            .input()
302            .downcast_ref::<StartDocumentAnalysisInput>()
303            .ok_or("failed to downcast to StartDocumentAnalysisInput")?;
304
305        let params = crate::config::endpoint::Params::builder()
306            .set_region(cfg.load::<::aws_types::region::Region>().map(|r| r.as_ref().to_owned()))
307            .set_use_dual_stack(cfg.load::<::aws_types::endpoint_config::UseDualStack>().map(|ty| ty.0))
308            .set_use_fips(cfg.load::<::aws_types::endpoint_config::UseFips>().map(|ty| ty.0))
309            .set_endpoint(cfg.load::<::aws_types::endpoint_config::EndpointUrl>().map(|ty| ty.0.clone()))
310            .build()
311            .map_err(|err| {
312                ::aws_smithy_runtime_api::client::interceptors::error::ContextAttachedError::new("endpoint params could not be built", err)
313            })?;
314        cfg.interceptor_state()
315            .store_put(::aws_smithy_runtime_api::client::endpoint::EndpointResolverParams::new(params));
316        ::std::result::Result::Ok(())
317    }
318}
319
320// The get_* functions below are generated from JMESPath expressions in the
321// operationContextParams trait. They target the operation's input shape.
322
323/// Error type for the `StartDocumentAnalysisError` operation.
324#[non_exhaustive]
325#[derive(::std::fmt::Debug)]
326pub enum StartDocumentAnalysisError {
327    /// <p>You aren't authorized to perform the action. Use the Amazon Resource Name (ARN) of an authorized user or IAM role to perform the operation.</p>
328    AccessDeniedException(crate::types::error::AccessDeniedException),
329    /// <p>Amazon Textract isn't able to read the document. For more information on the document limits in Amazon Textract, see <a href="https://docs.aws.amazon.com/textract/latest/dg/limits.html">Hard limits</a>.</p>
330    BadDocumentException(crate::types::error::BadDocumentException),
331    /// <p>The document can't be processed because it's too large. The maximum document size for synchronous operations 10 MB. The maximum document size for asynchronous operations is 500 MB for PDF files.</p>
332    DocumentTooLargeException(crate::types::error::DocumentTooLargeException),
333    /// <p>A <code>ClientRequestToken</code> input parameter was reused with an operation, but at least one of the other input parameters is different from the previous call to the operation.</p>
334    IdempotentParameterMismatchException(crate::types::error::IdempotentParameterMismatchException),
335    /// <p>Amazon Textract experienced a service issue. Try your call again.</p>
336    InternalServerError(crate::types::error::InternalServerError),
337    /// <p>Indicates you do not have decrypt permissions with the KMS key entered, or the KMS key was entered incorrectly.</p>
338    InvalidKmsKeyException(crate::types::error::InvalidKmsKeyException),
339    /// <p>An input parameter violated a constraint. For example, in synchronous operations, an <code>InvalidParameterException</code> exception occurs when neither of the <code>S3Object</code> or <code>Bytes</code> values are supplied in the <code>Document</code> request parameter. Validate your parameter before calling the API operation again.</p>
340    InvalidParameterException(crate::types::error::InvalidParameterException),
341    /// <p>Amazon Textract is unable to access the S3 object that's specified in the request. for more information, <a href="https://docs.aws.amazon.com/AmazonS3/latest/dev/s3-access-control.html">Configure Access to Amazon S3</a> For troubleshooting information, see <a href="https://docs.aws.amazon.com/AmazonS3/latest/dev/troubleshooting.html">Troubleshooting Amazon S3</a></p>
342    InvalidS3ObjectException(crate::types::error::InvalidS3ObjectException),
343    /// <p>An Amazon Textract service limit was exceeded. For example, if you start too many asynchronous jobs concurrently, calls to start operations (<code>StartDocumentTextDetection</code>, for example) raise a LimitExceededException exception (HTTP status code: 400) until the number of concurrently running jobs is below the Amazon Textract service limit.</p>
344    LimitExceededException(crate::types::error::LimitExceededException),
345    /// <p>The number of requests exceeded your throughput limit. If you want to increase this limit, contact Amazon Textract.</p>
346    ProvisionedThroughputExceededException(crate::types::error::ProvisionedThroughputExceededException),
347    /// <p>Amazon Textract is temporarily unable to process the request. Try your call again.</p>
348    ThrottlingException(crate::types::error::ThrottlingException),
349    /// <p>The format of the input document isn't supported. Documents for operations can be in PNG, JPEG, PDF, or TIFF format.</p>
350    UnsupportedDocumentException(crate::types::error::UnsupportedDocumentException),
351    /// An unexpected error occurred (e.g., invalid JSON returned by the service or an unknown error code).
352    #[deprecated(note = "Matching `Unhandled` directly is not forwards compatible. Instead, match using a \
353    variable wildcard pattern and check `.code()`:
354     \
355    &nbsp;&nbsp;&nbsp;`err if err.code() == Some(\"SpecificExceptionCode\") => { /* handle the error */ }`
356     \
357    See [`ProvideErrorMetadata`](#impl-ProvideErrorMetadata-for-StartDocumentAnalysisError) for what information is available for the error.")]
358    Unhandled(crate::error::sealed_unhandled::Unhandled),
359}
360impl StartDocumentAnalysisError {
361    /// Creates the `StartDocumentAnalysisError::Unhandled` variant from any error type.
362    pub fn unhandled(
363        err: impl ::std::convert::Into<::std::boxed::Box<dyn ::std::error::Error + ::std::marker::Send + ::std::marker::Sync + 'static>>,
364    ) -> Self {
365        Self::Unhandled(crate::error::sealed_unhandled::Unhandled {
366            source: err.into(),
367            meta: ::std::default::Default::default(),
368        })
369    }
370
371    /// Creates the `StartDocumentAnalysisError::Unhandled` variant from an [`ErrorMetadata`](::aws_smithy_types::error::ErrorMetadata).
372    pub fn generic(err: ::aws_smithy_types::error::ErrorMetadata) -> Self {
373        Self::Unhandled(crate::error::sealed_unhandled::Unhandled {
374            source: err.clone().into(),
375            meta: err,
376        })
377    }
378    ///
379    /// Returns error metadata, which includes the error code, message,
380    /// request ID, and potentially additional information.
381    ///
382    pub fn meta(&self) -> &::aws_smithy_types::error::ErrorMetadata {
383        match self {
384            Self::AccessDeniedException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
385            Self::BadDocumentException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
386            Self::DocumentTooLargeException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
387            Self::IdempotentParameterMismatchException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
388            Self::InternalServerError(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
389            Self::InvalidKmsKeyException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
390            Self::InvalidParameterException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
391            Self::InvalidS3ObjectException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
392            Self::LimitExceededException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
393            Self::ProvisionedThroughputExceededException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
394            Self::ThrottlingException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
395            Self::UnsupportedDocumentException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
396            Self::Unhandled(e) => &e.meta,
397        }
398    }
399    /// Returns `true` if the error kind is `StartDocumentAnalysisError::AccessDeniedException`.
400    pub fn is_access_denied_exception(&self) -> bool {
401        matches!(self, Self::AccessDeniedException(_))
402    }
403    /// Returns `true` if the error kind is `StartDocumentAnalysisError::BadDocumentException`.
404    pub fn is_bad_document_exception(&self) -> bool {
405        matches!(self, Self::BadDocumentException(_))
406    }
407    /// Returns `true` if the error kind is `StartDocumentAnalysisError::DocumentTooLargeException`.
408    pub fn is_document_too_large_exception(&self) -> bool {
409        matches!(self, Self::DocumentTooLargeException(_))
410    }
411    /// Returns `true` if the error kind is `StartDocumentAnalysisError::IdempotentParameterMismatchException`.
412    pub fn is_idempotent_parameter_mismatch_exception(&self) -> bool {
413        matches!(self, Self::IdempotentParameterMismatchException(_))
414    }
415    /// Returns `true` if the error kind is `StartDocumentAnalysisError::InternalServerError`.
416    pub fn is_internal_server_error(&self) -> bool {
417        matches!(self, Self::InternalServerError(_))
418    }
419    /// Returns `true` if the error kind is `StartDocumentAnalysisError::InvalidKmsKeyException`.
420    pub fn is_invalid_kms_key_exception(&self) -> bool {
421        matches!(self, Self::InvalidKmsKeyException(_))
422    }
423    /// Returns `true` if the error kind is `StartDocumentAnalysisError::InvalidParameterException`.
424    pub fn is_invalid_parameter_exception(&self) -> bool {
425        matches!(self, Self::InvalidParameterException(_))
426    }
427    /// Returns `true` if the error kind is `StartDocumentAnalysisError::InvalidS3ObjectException`.
428    pub fn is_invalid_s3_object_exception(&self) -> bool {
429        matches!(self, Self::InvalidS3ObjectException(_))
430    }
431    /// Returns `true` if the error kind is `StartDocumentAnalysisError::LimitExceededException`.
432    pub fn is_limit_exceeded_exception(&self) -> bool {
433        matches!(self, Self::LimitExceededException(_))
434    }
435    /// Returns `true` if the error kind is `StartDocumentAnalysisError::ProvisionedThroughputExceededException`.
436    pub fn is_provisioned_throughput_exceeded_exception(&self) -> bool {
437        matches!(self, Self::ProvisionedThroughputExceededException(_))
438    }
439    /// Returns `true` if the error kind is `StartDocumentAnalysisError::ThrottlingException`.
440    pub fn is_throttling_exception(&self) -> bool {
441        matches!(self, Self::ThrottlingException(_))
442    }
443    /// Returns `true` if the error kind is `StartDocumentAnalysisError::UnsupportedDocumentException`.
444    pub fn is_unsupported_document_exception(&self) -> bool {
445        matches!(self, Self::UnsupportedDocumentException(_))
446    }
447}
448impl ::std::error::Error for StartDocumentAnalysisError {
449    fn source(&self) -> ::std::option::Option<&(dyn ::std::error::Error + 'static)> {
450        match self {
451            Self::AccessDeniedException(_inner) => ::std::option::Option::Some(_inner),
452            Self::BadDocumentException(_inner) => ::std::option::Option::Some(_inner),
453            Self::DocumentTooLargeException(_inner) => ::std::option::Option::Some(_inner),
454            Self::IdempotentParameterMismatchException(_inner) => ::std::option::Option::Some(_inner),
455            Self::InternalServerError(_inner) => ::std::option::Option::Some(_inner),
456            Self::InvalidKmsKeyException(_inner) => ::std::option::Option::Some(_inner),
457            Self::InvalidParameterException(_inner) => ::std::option::Option::Some(_inner),
458            Self::InvalidS3ObjectException(_inner) => ::std::option::Option::Some(_inner),
459            Self::LimitExceededException(_inner) => ::std::option::Option::Some(_inner),
460            Self::ProvisionedThroughputExceededException(_inner) => ::std::option::Option::Some(_inner),
461            Self::ThrottlingException(_inner) => ::std::option::Option::Some(_inner),
462            Self::UnsupportedDocumentException(_inner) => ::std::option::Option::Some(_inner),
463            Self::Unhandled(_inner) => ::std::option::Option::Some(&*_inner.source),
464        }
465    }
466}
467impl ::std::fmt::Display for StartDocumentAnalysisError {
468    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
469        match self {
470            Self::AccessDeniedException(_inner) => _inner.fmt(f),
471            Self::BadDocumentException(_inner) => _inner.fmt(f),
472            Self::DocumentTooLargeException(_inner) => _inner.fmt(f),
473            Self::IdempotentParameterMismatchException(_inner) => _inner.fmt(f),
474            Self::InternalServerError(_inner) => _inner.fmt(f),
475            Self::InvalidKmsKeyException(_inner) => _inner.fmt(f),
476            Self::InvalidParameterException(_inner) => _inner.fmt(f),
477            Self::InvalidS3ObjectException(_inner) => _inner.fmt(f),
478            Self::LimitExceededException(_inner) => _inner.fmt(f),
479            Self::ProvisionedThroughputExceededException(_inner) => _inner.fmt(f),
480            Self::ThrottlingException(_inner) => _inner.fmt(f),
481            Self::UnsupportedDocumentException(_inner) => _inner.fmt(f),
482            Self::Unhandled(_inner) => {
483                if let ::std::option::Option::Some(code) = ::aws_smithy_types::error::metadata::ProvideErrorMetadata::code(self) {
484                    write!(f, "unhandled error ({code})")
485                } else {
486                    f.write_str("unhandled error")
487                }
488            }
489        }
490    }
491}
492impl ::aws_smithy_types::retry::ProvideErrorKind for StartDocumentAnalysisError {
493    fn code(&self) -> ::std::option::Option<&str> {
494        ::aws_smithy_types::error::metadata::ProvideErrorMetadata::code(self)
495    }
496    fn retryable_error_kind(&self) -> ::std::option::Option<::aws_smithy_types::retry::ErrorKind> {
497        ::std::option::Option::None
498    }
499}
500impl ::aws_smithy_types::error::metadata::ProvideErrorMetadata for StartDocumentAnalysisError {
501    fn meta(&self) -> &::aws_smithy_types::error::ErrorMetadata {
502        match self {
503            Self::AccessDeniedException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
504            Self::BadDocumentException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
505            Self::DocumentTooLargeException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
506            Self::IdempotentParameterMismatchException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
507            Self::InternalServerError(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
508            Self::InvalidKmsKeyException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
509            Self::InvalidParameterException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
510            Self::InvalidS3ObjectException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
511            Self::LimitExceededException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
512            Self::ProvisionedThroughputExceededException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
513            Self::ThrottlingException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
514            Self::UnsupportedDocumentException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
515            Self::Unhandled(_inner) => &_inner.meta,
516        }
517    }
518}
519impl ::aws_smithy_runtime_api::client::result::CreateUnhandledError for StartDocumentAnalysisError {
520    fn create_unhandled_error(
521        source: ::std::boxed::Box<dyn ::std::error::Error + ::std::marker::Send + ::std::marker::Sync + 'static>,
522        meta: ::std::option::Option<::aws_smithy_types::error::ErrorMetadata>,
523    ) -> Self {
524        Self::Unhandled(crate::error::sealed_unhandled::Unhandled {
525            source,
526            meta: meta.unwrap_or_default(),
527        })
528    }
529}
530impl ::aws_types::request_id::RequestId for crate::operation::start_document_analysis::StartDocumentAnalysisError {
531    fn request_id(&self) -> Option<&str> {
532        self.meta().request_id()
533    }
534}
535
536pub use crate::operation::start_document_analysis::_start_document_analysis_input::StartDocumentAnalysisInput;
537
538pub use crate::operation::start_document_analysis::_start_document_analysis_output::StartDocumentAnalysisOutput;
539
540mod _start_document_analysis_input;
541
542mod _start_document_analysis_output;
543
544/// Builders
545pub mod builders;