aws_sdk_rekognition/operation/
detect_text.rs

1// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
2/// Orchestration and serialization glue logic for `DetectText`.
3#[derive(::std::clone::Clone, ::std::default::Default, ::std::fmt::Debug)]
4#[non_exhaustive]
5pub struct DetectText;
6impl DetectText {
7    /// Creates a new `DetectText`
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::detect_text::DetectTextInput,
14    ) -> ::std::result::Result<
15        crate::operation::detect_text::DetectTextOutput,
16        ::aws_smithy_runtime_api::client::result::SdkError<
17            crate::operation::detect_text::DetectTextError,
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::detect_text::DetectTextError>()
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::detect_text::DetectTextOutput>()
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::detect_text::DetectTextInput,
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("Rekognition", "DetectText", 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                "Rekognition.DetectText",
59                "rpc.service" = "Rekognition",
60                "rpc.method" = "DetectText",
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        runtime_plugins = runtime_plugins.with_client_plugin(crate::auth_plugin::DefaultAuthOptionsPlugin::new(vec![
74            ::aws_runtime::auth::sigv4::SCHEME_ID,
75        ]));
76        if let ::std::option::Option::Some(config_override) = config_override {
77            for plugin in config_override.runtime_plugins.iter().cloned() {
78                runtime_plugins = runtime_plugins.with_operation_plugin(plugin);
79            }
80            runtime_plugins = runtime_plugins.with_operation_plugin(crate::config::ConfigOverrideRuntimePlugin::new(
81                config_override,
82                client_config.config.clone(),
83                &client_config.runtime_components,
84            ));
85        }
86        runtime_plugins
87    }
88}
89impl ::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin for DetectText {
90    fn config(&self) -> ::std::option::Option<::aws_smithy_types::config_bag::FrozenLayer> {
91        let mut cfg = ::aws_smithy_types::config_bag::Layer::new("DetectText");
92
93        cfg.store_put(::aws_smithy_runtime_api::client::ser_de::SharedRequestSerializer::new(
94            DetectTextRequestSerializer,
95        ));
96        cfg.store_put(::aws_smithy_runtime_api::client::ser_de::SharedResponseDeserializer::new(
97            DetectTextResponseDeserializer,
98        ));
99
100        cfg.store_put(::aws_smithy_runtime_api::client::auth::AuthSchemeOptionResolverParams::new(
101            ::aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolverParams::new(),
102        ));
103
104        cfg.store_put(::aws_smithy_runtime_api::client::orchestrator::Metadata::new("DetectText", "Rekognition"));
105        let mut signing_options = ::aws_runtime::auth::SigningOptions::default();
106        signing_options.double_uri_encode = true;
107        signing_options.content_sha256_header = false;
108        signing_options.normalize_uri_path = true;
109        signing_options.payload_override = None;
110
111        cfg.store_put(::aws_runtime::auth::SigV4OperationSigningConfig {
112            signing_options,
113            ..::std::default::Default::default()
114        });
115
116        ::std::option::Option::Some(cfg.freeze())
117    }
118
119    fn runtime_components(
120        &self,
121        _: &::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder,
122    ) -> ::std::borrow::Cow<'_, ::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder> {
123        #[allow(unused_mut)]
124        let mut rcb = ::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder::new("DetectText")
125            .with_interceptor(::aws_smithy_runtime::client::stalled_stream_protection::StalledStreamProtectionInterceptor::default())
126            .with_interceptor(DetectTextEndpointParamsInterceptor)
127            .with_retry_classifier(::aws_smithy_runtime::client::retries::classifiers::TransientErrorClassifier::<
128                crate::operation::detect_text::DetectTextError,
129            >::new())
130            .with_retry_classifier(::aws_smithy_runtime::client::retries::classifiers::ModeledAsRetryableClassifier::<
131                crate::operation::detect_text::DetectTextError,
132            >::new())
133            .with_retry_classifier(::aws_runtime::retries::classifiers::AwsErrorCodeClassifier::<
134                crate::operation::detect_text::DetectTextError,
135            >::new());
136
137        ::std::borrow::Cow::Owned(rcb)
138    }
139}
140
141#[derive(Debug)]
142struct DetectTextResponseDeserializer;
143impl ::aws_smithy_runtime_api::client::ser_de::DeserializeResponse for DetectTextResponseDeserializer {
144    fn deserialize_nonstreaming(
145        &self,
146        response: &::aws_smithy_runtime_api::client::orchestrator::HttpResponse,
147    ) -> ::aws_smithy_runtime_api::client::interceptors::context::OutputOrError {
148        let (success, status) = (response.status().is_success(), response.status().as_u16());
149        let headers = response.headers();
150        let body = response.body().bytes().expect("body loaded");
151        #[allow(unused_mut)]
152        let mut force_error = false;
153        ::tracing::debug!(request_id = ?::aws_types::request_id::RequestId::request_id(response));
154        let parse_result = if !success && status != 200 || force_error {
155            crate::protocol_serde::shape_detect_text::de_detect_text_http_error(status, headers, body)
156        } else {
157            crate::protocol_serde::shape_detect_text::de_detect_text_http_response(status, headers, body)
158        };
159        crate::protocol_serde::type_erase_result(parse_result)
160    }
161}
162#[derive(Debug)]
163struct DetectTextRequestSerializer;
164impl ::aws_smithy_runtime_api::client::ser_de::SerializeRequest for DetectTextRequestSerializer {
165    #[allow(unused_mut, clippy::let_and_return, clippy::needless_borrow, clippy::useless_conversion)]
166    fn serialize_input(
167        &self,
168        input: ::aws_smithy_runtime_api::client::interceptors::context::Input,
169        _cfg: &mut ::aws_smithy_types::config_bag::ConfigBag,
170    ) -> ::std::result::Result<::aws_smithy_runtime_api::client::orchestrator::HttpRequest, ::aws_smithy_runtime_api::box_error::BoxError> {
171        let input = input.downcast::<crate::operation::detect_text::DetectTextInput>().expect("correct type");
172        let _header_serialization_settings = _cfg
173            .load::<crate::serialization_settings::HeaderSerializationSettings>()
174            .cloned()
175            .unwrap_or_default();
176        let mut request_builder = {
177            fn uri_base(
178                _input: &crate::operation::detect_text::DetectTextInput,
179                output: &mut ::std::string::String,
180            ) -> ::std::result::Result<(), ::aws_smithy_types::error::operation::BuildError> {
181                use ::std::fmt::Write as _;
182                ::std::write!(output, "/").expect("formatting should succeed");
183                ::std::result::Result::Ok(())
184            }
185            #[allow(clippy::unnecessary_wraps)]
186            fn update_http_builder(
187                input: &crate::operation::detect_text::DetectTextInput,
188                builder: ::http::request::Builder,
189            ) -> ::std::result::Result<::http::request::Builder, ::aws_smithy_types::error::operation::BuildError> {
190                let mut uri = ::std::string::String::new();
191                uri_base(input, &mut uri)?;
192                ::std::result::Result::Ok(builder.method("POST").uri(uri))
193            }
194            let mut builder = update_http_builder(&input, ::http::request::Builder::new())?;
195            builder = _header_serialization_settings.set_default_header(builder, ::http::header::CONTENT_TYPE, "application/x-amz-json-1.1");
196            builder = _header_serialization_settings.set_default_header(
197                builder,
198                ::http::header::HeaderName::from_static("x-amz-target"),
199                "RekognitionService.DetectText",
200            );
201            builder
202        };
203        let body = ::aws_smithy_types::body::SdkBody::from(crate::protocol_serde::shape_detect_text::ser_detect_text_input(&input)?);
204        if let Some(content_length) = body.content_length() {
205            let content_length = content_length.to_string();
206            request_builder = _header_serialization_settings.set_default_header(request_builder, ::http::header::CONTENT_LENGTH, &content_length);
207        }
208        ::std::result::Result::Ok(request_builder.body(body).expect("valid request").try_into().unwrap())
209    }
210}
211#[derive(Debug)]
212struct DetectTextEndpointParamsInterceptor;
213
214impl ::aws_smithy_runtime_api::client::interceptors::Intercept for DetectTextEndpointParamsInterceptor {
215    fn name(&self) -> &'static str {
216        "DetectTextEndpointParamsInterceptor"
217    }
218
219    fn read_before_execution(
220        &self,
221        context: &::aws_smithy_runtime_api::client::interceptors::context::BeforeSerializationInterceptorContextRef<
222            '_,
223            ::aws_smithy_runtime_api::client::interceptors::context::Input,
224            ::aws_smithy_runtime_api::client::interceptors::context::Output,
225            ::aws_smithy_runtime_api::client::interceptors::context::Error,
226        >,
227        cfg: &mut ::aws_smithy_types::config_bag::ConfigBag,
228    ) -> ::std::result::Result<(), ::aws_smithy_runtime_api::box_error::BoxError> {
229        let _input = context
230            .input()
231            .downcast_ref::<DetectTextInput>()
232            .ok_or("failed to downcast to DetectTextInput")?;
233
234        let params = crate::config::endpoint::Params::builder()
235            .set_region(cfg.load::<::aws_types::region::Region>().map(|r| r.as_ref().to_owned()))
236            .set_use_dual_stack(cfg.load::<::aws_types::endpoint_config::UseDualStack>().map(|ty| ty.0))
237            .set_use_fips(cfg.load::<::aws_types::endpoint_config::UseFips>().map(|ty| ty.0))
238            .set_endpoint(cfg.load::<::aws_types::endpoint_config::EndpointUrl>().map(|ty| ty.0.clone()))
239            .build()
240            .map_err(|err| {
241                ::aws_smithy_runtime_api::client::interceptors::error::ContextAttachedError::new("endpoint params could not be built", err)
242            })?;
243        cfg.interceptor_state()
244            .store_put(::aws_smithy_runtime_api::client::endpoint::EndpointResolverParams::new(params));
245        ::std::result::Result::Ok(())
246    }
247}
248
249// The get_* functions below are generated from JMESPath expressions in the
250// operationContextParams trait. They target the operation's input shape.
251
252/// Error type for the `DetectTextError` operation.
253#[non_exhaustive]
254#[derive(::std::fmt::Debug)]
255pub enum DetectTextError {
256    /// <p>You are not authorized to perform the action.</p>
257    AccessDeniedException(crate::types::error::AccessDeniedException),
258    /// <p>The input image size exceeds the allowed limit. If you are calling DetectProtectiveEquipment, the image size or resolution exceeds the allowed limit. For more information, see Guidelines and quotas in Amazon Rekognition in the Amazon Rekognition Developer Guide.</p>
259    ImageTooLargeException(crate::types::error::ImageTooLargeException),
260    /// <p>Amazon Rekognition experienced a service issue. Try your call again.</p>
261    InternalServerError(crate::types::error::InternalServerError),
262    /// <p>The provided image format is not supported.</p>
263    InvalidImageFormatException(crate::types::error::InvalidImageFormatException),
264    /// <p>Input parameter violated a constraint. Validate your parameter before calling the API operation again.</p>
265    InvalidParameterException(crate::types::error::InvalidParameterException),
266    /// <p>Amazon Rekognition is unable to access the S3 object specified in the request.</p>
267    InvalidS3ObjectException(crate::types::error::InvalidS3ObjectException),
268    /// <p>The number of requests exceeded your throughput limit. If you want to increase this limit, contact Amazon Rekognition.</p>
269    ProvisionedThroughputExceededException(crate::types::error::ProvisionedThroughputExceededException),
270    /// <p>Amazon Rekognition is temporarily unable to process the request. Try your call again.</p>
271    ThrottlingException(crate::types::error::ThrottlingException),
272    /// An unexpected error occurred (e.g., invalid JSON returned by the service or an unknown error code).
273    #[deprecated(note = "Matching `Unhandled` directly is not forwards compatible. Instead, match using a \
274    variable wildcard pattern and check `.code()`:
275     \
276    &nbsp;&nbsp;&nbsp;`err if err.code() == Some(\"SpecificExceptionCode\") => { /* handle the error */ }`
277     \
278    See [`ProvideErrorMetadata`](#impl-ProvideErrorMetadata-for-DetectTextError) for what information is available for the error.")]
279    Unhandled(crate::error::sealed_unhandled::Unhandled),
280}
281impl DetectTextError {
282    /// Creates the `DetectTextError::Unhandled` variant from any error type.
283    pub fn unhandled(
284        err: impl ::std::convert::Into<::std::boxed::Box<dyn ::std::error::Error + ::std::marker::Send + ::std::marker::Sync + 'static>>,
285    ) -> Self {
286        Self::Unhandled(crate::error::sealed_unhandled::Unhandled {
287            source: err.into(),
288            meta: ::std::default::Default::default(),
289        })
290    }
291
292    /// Creates the `DetectTextError::Unhandled` variant from an [`ErrorMetadata`](::aws_smithy_types::error::ErrorMetadata).
293    pub fn generic(err: ::aws_smithy_types::error::ErrorMetadata) -> Self {
294        Self::Unhandled(crate::error::sealed_unhandled::Unhandled {
295            source: err.clone().into(),
296            meta: err,
297        })
298    }
299    ///
300    /// Returns error metadata, which includes the error code, message,
301    /// request ID, and potentially additional information.
302    ///
303    pub fn meta(&self) -> &::aws_smithy_types::error::ErrorMetadata {
304        match self {
305            Self::AccessDeniedException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
306            Self::ImageTooLargeException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
307            Self::InternalServerError(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
308            Self::InvalidImageFormatException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
309            Self::InvalidParameterException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
310            Self::InvalidS3ObjectException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
311            Self::ProvisionedThroughputExceededException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
312            Self::ThrottlingException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
313            Self::Unhandled(e) => &e.meta,
314        }
315    }
316    /// Returns `true` if the error kind is `DetectTextError::AccessDeniedException`.
317    pub fn is_access_denied_exception(&self) -> bool {
318        matches!(self, Self::AccessDeniedException(_))
319    }
320    /// Returns `true` if the error kind is `DetectTextError::ImageTooLargeException`.
321    pub fn is_image_too_large_exception(&self) -> bool {
322        matches!(self, Self::ImageTooLargeException(_))
323    }
324    /// Returns `true` if the error kind is `DetectTextError::InternalServerError`.
325    pub fn is_internal_server_error(&self) -> bool {
326        matches!(self, Self::InternalServerError(_))
327    }
328    /// Returns `true` if the error kind is `DetectTextError::InvalidImageFormatException`.
329    pub fn is_invalid_image_format_exception(&self) -> bool {
330        matches!(self, Self::InvalidImageFormatException(_))
331    }
332    /// Returns `true` if the error kind is `DetectTextError::InvalidParameterException`.
333    pub fn is_invalid_parameter_exception(&self) -> bool {
334        matches!(self, Self::InvalidParameterException(_))
335    }
336    /// Returns `true` if the error kind is `DetectTextError::InvalidS3ObjectException`.
337    pub fn is_invalid_s3_object_exception(&self) -> bool {
338        matches!(self, Self::InvalidS3ObjectException(_))
339    }
340    /// Returns `true` if the error kind is `DetectTextError::ProvisionedThroughputExceededException`.
341    pub fn is_provisioned_throughput_exceeded_exception(&self) -> bool {
342        matches!(self, Self::ProvisionedThroughputExceededException(_))
343    }
344    /// Returns `true` if the error kind is `DetectTextError::ThrottlingException`.
345    pub fn is_throttling_exception(&self) -> bool {
346        matches!(self, Self::ThrottlingException(_))
347    }
348}
349impl ::std::error::Error for DetectTextError {
350    fn source(&self) -> ::std::option::Option<&(dyn ::std::error::Error + 'static)> {
351        match self {
352            Self::AccessDeniedException(_inner) => ::std::option::Option::Some(_inner),
353            Self::ImageTooLargeException(_inner) => ::std::option::Option::Some(_inner),
354            Self::InternalServerError(_inner) => ::std::option::Option::Some(_inner),
355            Self::InvalidImageFormatException(_inner) => ::std::option::Option::Some(_inner),
356            Self::InvalidParameterException(_inner) => ::std::option::Option::Some(_inner),
357            Self::InvalidS3ObjectException(_inner) => ::std::option::Option::Some(_inner),
358            Self::ProvisionedThroughputExceededException(_inner) => ::std::option::Option::Some(_inner),
359            Self::ThrottlingException(_inner) => ::std::option::Option::Some(_inner),
360            Self::Unhandled(_inner) => ::std::option::Option::Some(&*_inner.source),
361        }
362    }
363}
364impl ::std::fmt::Display for DetectTextError {
365    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
366        match self {
367            Self::AccessDeniedException(_inner) => _inner.fmt(f),
368            Self::ImageTooLargeException(_inner) => _inner.fmt(f),
369            Self::InternalServerError(_inner) => _inner.fmt(f),
370            Self::InvalidImageFormatException(_inner) => _inner.fmt(f),
371            Self::InvalidParameterException(_inner) => _inner.fmt(f),
372            Self::InvalidS3ObjectException(_inner) => _inner.fmt(f),
373            Self::ProvisionedThroughputExceededException(_inner) => _inner.fmt(f),
374            Self::ThrottlingException(_inner) => _inner.fmt(f),
375            Self::Unhandled(_inner) => {
376                if let ::std::option::Option::Some(code) = ::aws_smithy_types::error::metadata::ProvideErrorMetadata::code(self) {
377                    write!(f, "unhandled error ({code})")
378                } else {
379                    f.write_str("unhandled error")
380                }
381            }
382        }
383    }
384}
385impl ::aws_smithy_types::retry::ProvideErrorKind for DetectTextError {
386    fn code(&self) -> ::std::option::Option<&str> {
387        ::aws_smithy_types::error::metadata::ProvideErrorMetadata::code(self)
388    }
389    fn retryable_error_kind(&self) -> ::std::option::Option<::aws_smithy_types::retry::ErrorKind> {
390        ::std::option::Option::None
391    }
392}
393impl ::aws_smithy_types::error::metadata::ProvideErrorMetadata for DetectTextError {
394    fn meta(&self) -> &::aws_smithy_types::error::ErrorMetadata {
395        match self {
396            Self::AccessDeniedException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
397            Self::ImageTooLargeException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
398            Self::InternalServerError(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
399            Self::InvalidImageFormatException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
400            Self::InvalidParameterException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
401            Self::InvalidS3ObjectException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
402            Self::ProvisionedThroughputExceededException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
403            Self::ThrottlingException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
404            Self::Unhandled(_inner) => &_inner.meta,
405        }
406    }
407}
408impl ::aws_smithy_runtime_api::client::result::CreateUnhandledError for DetectTextError {
409    fn create_unhandled_error(
410        source: ::std::boxed::Box<dyn ::std::error::Error + ::std::marker::Send + ::std::marker::Sync + 'static>,
411        meta: ::std::option::Option<::aws_smithy_types::error::ErrorMetadata>,
412    ) -> Self {
413        Self::Unhandled(crate::error::sealed_unhandled::Unhandled {
414            source,
415            meta: meta.unwrap_or_default(),
416        })
417    }
418}
419impl ::aws_types::request_id::RequestId for crate::operation::detect_text::DetectTextError {
420    fn request_id(&self) -> Option<&str> {
421        self.meta().request_id()
422    }
423}
424
425pub use crate::operation::detect_text::_detect_text_output::DetectTextOutput;
426
427pub use crate::operation::detect_text::_detect_text_input::DetectTextInput;
428
429mod _detect_text_input;
430
431mod _detect_text_output;
432
433/// Builders
434pub mod builders;