aws_sdk_resiliencehub/operation/
create_recommendation_template.rs

1// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
2/// Orchestration and serialization glue logic for `CreateRecommendationTemplate`.
3#[derive(::std::clone::Clone, ::std::default::Default, ::std::fmt::Debug)]
4#[non_exhaustive]
5pub struct CreateRecommendationTemplate;
6impl CreateRecommendationTemplate {
7    /// Creates a new `CreateRecommendationTemplate`
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::create_recommendation_template::CreateRecommendationTemplateInput,
14    ) -> ::std::result::Result<
15        crate::operation::create_recommendation_template::CreateRecommendationTemplateOutput,
16        ::aws_smithy_runtime_api::client::result::SdkError<
17            crate::operation::create_recommendation_template::CreateRecommendationTemplateError,
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::create_recommendation_template::CreateRecommendationTemplateError>()
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::create_recommendation_template::CreateRecommendationTemplateOutput>()
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::create_recommendation_template::CreateRecommendationTemplateInput,
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(
55            "resiliencehub",
56            "CreateRecommendationTemplate",
57            input,
58            runtime_plugins,
59            stop_point,
60        )
61        // Create a parent span for the entire operation. Includes a random, internal-only,
62        // seven-digit ID for the operation orchestration so that it can be correlated in the logs.
63        .instrument(::tracing::debug_span!(
64            "resiliencehub.CreateRecommendationTemplate",
65            "rpc.service" = "resiliencehub",
66            "rpc.method" = "CreateRecommendationTemplate",
67            "sdk_invocation_id" = ::fastrand::u32(1_000_000..10_000_000),
68            "rpc.system" = "aws-api",
69        ))
70        .await
71    }
72
73    pub(crate) fn operation_runtime_plugins(
74        client_runtime_plugins: ::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins,
75        client_config: &crate::config::Config,
76        config_override: ::std::option::Option<crate::config::Builder>,
77    ) -> ::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins {
78        let mut runtime_plugins = client_runtime_plugins.with_operation_plugin(Self::new());
79        runtime_plugins = runtime_plugins.with_operation_plugin(crate::client_idempotency_token::IdempotencyTokenRuntimePlugin::new(
80            |token_provider, input| {
81                let input: &mut crate::operation::create_recommendation_template::CreateRecommendationTemplateInput =
82                    input.downcast_mut().expect("correct type");
83                if input.client_token.is_none() {
84                    input.client_token = ::std::option::Option::Some(token_provider.make_idempotency_token());
85                }
86            },
87        ));
88        if let ::std::option::Option::Some(config_override) = config_override {
89            for plugin in config_override.runtime_plugins.iter().cloned() {
90                runtime_plugins = runtime_plugins.with_operation_plugin(plugin);
91            }
92            runtime_plugins = runtime_plugins.with_operation_plugin(crate::config::ConfigOverrideRuntimePlugin::new(
93                config_override,
94                client_config.config.clone(),
95                &client_config.runtime_components,
96            ));
97        }
98        runtime_plugins
99    }
100}
101impl ::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin for CreateRecommendationTemplate {
102    fn config(&self) -> ::std::option::Option<::aws_smithy_types::config_bag::FrozenLayer> {
103        let mut cfg = ::aws_smithy_types::config_bag::Layer::new("CreateRecommendationTemplate");
104
105        cfg.store_put(::aws_smithy_runtime_api::client::ser_de::SharedRequestSerializer::new(
106            CreateRecommendationTemplateRequestSerializer,
107        ));
108        cfg.store_put(::aws_smithy_runtime_api::client::ser_de::SharedResponseDeserializer::new(
109            CreateRecommendationTemplateResponseDeserializer,
110        ));
111
112        cfg.store_put(::aws_smithy_runtime_api::client::auth::AuthSchemeOptionResolverParams::new(
113            crate::config::auth::Params::builder()
114                .operation_name("CreateRecommendationTemplate")
115                .build()
116                .expect("required fields set"),
117        ));
118
119        cfg.store_put(::aws_smithy_runtime_api::client::orchestrator::SensitiveOutput);
120        cfg.store_put(::aws_smithy_runtime_api::client::orchestrator::Metadata::new(
121            "CreateRecommendationTemplate",
122            "resiliencehub",
123        ));
124        let mut signing_options = ::aws_runtime::auth::SigningOptions::default();
125        signing_options.double_uri_encode = true;
126        signing_options.content_sha256_header = false;
127        signing_options.normalize_uri_path = true;
128        signing_options.payload_override = None;
129
130        cfg.store_put(::aws_runtime::auth::SigV4OperationSigningConfig {
131            signing_options,
132            ..::std::default::Default::default()
133        });
134
135        ::std::option::Option::Some(cfg.freeze())
136    }
137
138    fn runtime_components(
139        &self,
140        _: &::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder,
141    ) -> ::std::borrow::Cow<'_, ::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder> {
142        #[allow(unused_mut)]
143        let mut rcb = ::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder::new("CreateRecommendationTemplate")
144            .with_interceptor(::aws_smithy_runtime::client::stalled_stream_protection::StalledStreamProtectionInterceptor::default())
145            .with_interceptor(CreateRecommendationTemplateEndpointParamsInterceptor)
146            .with_retry_classifier(::aws_smithy_runtime::client::retries::classifiers::TransientErrorClassifier::<
147                crate::operation::create_recommendation_template::CreateRecommendationTemplateError,
148            >::new())
149            .with_retry_classifier(::aws_smithy_runtime::client::retries::classifiers::ModeledAsRetryableClassifier::<
150                crate::operation::create_recommendation_template::CreateRecommendationTemplateError,
151            >::new())
152            .with_retry_classifier(::aws_runtime::retries::classifiers::AwsErrorCodeClassifier::<
153                crate::operation::create_recommendation_template::CreateRecommendationTemplateError,
154            >::new());
155
156        ::std::borrow::Cow::Owned(rcb)
157    }
158}
159
160#[derive(Debug)]
161struct CreateRecommendationTemplateResponseDeserializer;
162impl ::aws_smithy_runtime_api::client::ser_de::DeserializeResponse for CreateRecommendationTemplateResponseDeserializer {
163    fn deserialize_nonstreaming(
164        &self,
165        response: &::aws_smithy_runtime_api::client::orchestrator::HttpResponse,
166    ) -> ::aws_smithy_runtime_api::client::interceptors::context::OutputOrError {
167        let (success, status) = (response.status().is_success(), response.status().as_u16());
168        let headers = response.headers();
169        let body = response.body().bytes().expect("body loaded");
170        #[allow(unused_mut)]
171        let mut force_error = false;
172        ::tracing::debug!(request_id = ?::aws_types::request_id::RequestId::request_id(response));
173        let parse_result = if !success && status != 200 || force_error {
174            crate::protocol_serde::shape_create_recommendation_template::de_create_recommendation_template_http_error(status, headers, body)
175        } else {
176            crate::protocol_serde::shape_create_recommendation_template::de_create_recommendation_template_http_response(status, headers, body)
177        };
178        crate::protocol_serde::type_erase_result(parse_result)
179    }
180}
181#[derive(Debug)]
182struct CreateRecommendationTemplateRequestSerializer;
183impl ::aws_smithy_runtime_api::client::ser_de::SerializeRequest for CreateRecommendationTemplateRequestSerializer {
184    #[allow(unused_mut, clippy::let_and_return, clippy::needless_borrow, clippy::useless_conversion)]
185    fn serialize_input(
186        &self,
187        input: ::aws_smithy_runtime_api::client::interceptors::context::Input,
188        _cfg: &mut ::aws_smithy_types::config_bag::ConfigBag,
189    ) -> ::std::result::Result<::aws_smithy_runtime_api::client::orchestrator::HttpRequest, ::aws_smithy_runtime_api::box_error::BoxError> {
190        let input = input
191            .downcast::<crate::operation::create_recommendation_template::CreateRecommendationTemplateInput>()
192            .expect("correct type");
193        let _header_serialization_settings = _cfg
194            .load::<crate::serialization_settings::HeaderSerializationSettings>()
195            .cloned()
196            .unwrap_or_default();
197        let mut request_builder = {
198            #[allow(clippy::uninlined_format_args)]
199            fn uri_base(
200                _input: &crate::operation::create_recommendation_template::CreateRecommendationTemplateInput,
201                output: &mut ::std::string::String,
202            ) -> ::std::result::Result<(), ::aws_smithy_types::error::operation::BuildError> {
203                use ::std::fmt::Write as _;
204                ::std::write!(output, "/create-recommendation-template").expect("formatting should succeed");
205                ::std::result::Result::Ok(())
206            }
207            #[allow(clippy::unnecessary_wraps)]
208            fn update_http_builder(
209                input: &crate::operation::create_recommendation_template::CreateRecommendationTemplateInput,
210                builder: ::http::request::Builder,
211            ) -> ::std::result::Result<::http::request::Builder, ::aws_smithy_types::error::operation::BuildError> {
212                let mut uri = ::std::string::String::new();
213                uri_base(input, &mut uri)?;
214                ::std::result::Result::Ok(builder.method("POST").uri(uri))
215            }
216            let mut builder = update_http_builder(&input, ::http::request::Builder::new())?;
217            builder = _header_serialization_settings.set_default_header(builder, ::http::header::CONTENT_TYPE, "application/json");
218            builder
219        };
220        let body = ::aws_smithy_types::body::SdkBody::from(
221            crate::protocol_serde::shape_create_recommendation_template::ser_create_recommendation_template_input(&input)?,
222        );
223        if let Some(content_length) = body.content_length() {
224            let content_length = content_length.to_string();
225            request_builder = _header_serialization_settings.set_default_header(request_builder, ::http::header::CONTENT_LENGTH, &content_length);
226        }
227        ::std::result::Result::Ok(request_builder.body(body).expect("valid request").try_into().unwrap())
228    }
229}
230#[derive(Debug)]
231struct CreateRecommendationTemplateEndpointParamsInterceptor;
232
233impl ::aws_smithy_runtime_api::client::interceptors::Intercept for CreateRecommendationTemplateEndpointParamsInterceptor {
234    fn name(&self) -> &'static str {
235        "CreateRecommendationTemplateEndpointParamsInterceptor"
236    }
237
238    fn read_before_execution(
239        &self,
240        context: &::aws_smithy_runtime_api::client::interceptors::context::BeforeSerializationInterceptorContextRef<
241            '_,
242            ::aws_smithy_runtime_api::client::interceptors::context::Input,
243            ::aws_smithy_runtime_api::client::interceptors::context::Output,
244            ::aws_smithy_runtime_api::client::interceptors::context::Error,
245        >,
246        cfg: &mut ::aws_smithy_types::config_bag::ConfigBag,
247    ) -> ::std::result::Result<(), ::aws_smithy_runtime_api::box_error::BoxError> {
248        let _input = context
249            .input()
250            .downcast_ref::<CreateRecommendationTemplateInput>()
251            .ok_or("failed to downcast to CreateRecommendationTemplateInput")?;
252
253        let params = crate::config::endpoint::Params::builder()
254            .set_region(cfg.load::<::aws_types::region::Region>().map(|r| r.as_ref().to_owned()))
255            .set_use_dual_stack(cfg.load::<::aws_types::endpoint_config::UseDualStack>().map(|ty| ty.0))
256            .set_use_fips(cfg.load::<::aws_types::endpoint_config::UseFips>().map(|ty| ty.0))
257            .set_endpoint(cfg.load::<::aws_types::endpoint_config::EndpointUrl>().map(|ty| ty.0.clone()))
258            .build()
259            .map_err(|err| {
260                ::aws_smithy_runtime_api::client::interceptors::error::ContextAttachedError::new("endpoint params could not be built", err)
261            })?;
262        cfg.interceptor_state()
263            .store_put(::aws_smithy_runtime_api::client::endpoint::EndpointResolverParams::new(params));
264        ::std::result::Result::Ok(())
265    }
266}
267
268// The get_* functions below are generated from JMESPath expressions in the
269// operationContextParams trait. They target the operation's input shape.
270
271/// Error type for the `CreateRecommendationTemplateError` operation.
272#[non_exhaustive]
273#[derive(::std::fmt::Debug)]
274pub enum CreateRecommendationTemplateError {
275    /// <p>You don't have permissions to perform the requested operation. The user or role that is making the request must have at least one IAM permissions policy attached that grants the required permissions.</p>
276    AccessDeniedException(crate::types::error::AccessDeniedException),
277    /// <p>This exception occurs when a conflict with a previous successful write is detected. This generally occurs when the previous write did not have time to propagate to the host serving the current request. A retry (with appropriate backoff logic) is the recommended response to this exception.</p>
278    ConflictException(crate::types::error::ConflictException),
279    /// <p>This exception occurs when there is an internal failure in the Resilience Hub service.</p>
280    InternalServerException(crate::types::error::InternalServerException),
281    /// <p>This exception occurs when the specified resource could not be found.</p>
282    ResourceNotFoundException(crate::types::error::ResourceNotFoundException),
283    /// <p>This exception occurs when you have exceeded your service quota. To perform the requested action, remove some of the relevant resources, or use Service Quotas to request a service quota increase.</p>
284    ServiceQuotaExceededException(crate::types::error::ServiceQuotaExceededException),
285    /// <p>This exception occurs when you have exceeded the limit on the number of requests per second.</p>
286    ThrottlingException(crate::types::error::ThrottlingException),
287    /// <p>This exception occurs when a request is not valid.</p>
288    ValidationException(crate::types::error::ValidationException),
289    /// An unexpected error occurred (e.g., invalid JSON returned by the service or an unknown error code).
290    #[deprecated(note = "Matching `Unhandled` directly is not forwards compatible. Instead, match using a \
291    variable wildcard pattern and check `.code()`:
292     \
293    &nbsp;&nbsp;&nbsp;`err if err.code() == Some(\"SpecificExceptionCode\") => { /* handle the error */ }`
294     \
295    See [`ProvideErrorMetadata`](#impl-ProvideErrorMetadata-for-CreateRecommendationTemplateError) for what information is available for the error.")]
296    Unhandled(crate::error::sealed_unhandled::Unhandled),
297}
298impl CreateRecommendationTemplateError {
299    /// Creates the `CreateRecommendationTemplateError::Unhandled` variant from any error type.
300    pub fn unhandled(
301        err: impl ::std::convert::Into<::std::boxed::Box<dyn ::std::error::Error + ::std::marker::Send + ::std::marker::Sync + 'static>>,
302    ) -> Self {
303        Self::Unhandled(crate::error::sealed_unhandled::Unhandled {
304            source: err.into(),
305            meta: ::std::default::Default::default(),
306        })
307    }
308
309    /// Creates the `CreateRecommendationTemplateError::Unhandled` variant from an [`ErrorMetadata`](::aws_smithy_types::error::ErrorMetadata).
310    pub fn generic(err: ::aws_smithy_types::error::ErrorMetadata) -> Self {
311        Self::Unhandled(crate::error::sealed_unhandled::Unhandled {
312            source: err.clone().into(),
313            meta: err,
314        })
315    }
316    ///
317    /// Returns error metadata, which includes the error code, message,
318    /// request ID, and potentially additional information.
319    ///
320    pub fn meta(&self) -> &::aws_smithy_types::error::ErrorMetadata {
321        match self {
322            Self::AccessDeniedException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
323            Self::ConflictException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
324            Self::InternalServerException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
325            Self::ResourceNotFoundException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
326            Self::ServiceQuotaExceededException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
327            Self::ThrottlingException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
328            Self::ValidationException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
329            Self::Unhandled(e) => &e.meta,
330        }
331    }
332    /// Returns `true` if the error kind is `CreateRecommendationTemplateError::AccessDeniedException`.
333    pub fn is_access_denied_exception(&self) -> bool {
334        matches!(self, Self::AccessDeniedException(_))
335    }
336    /// Returns `true` if the error kind is `CreateRecommendationTemplateError::ConflictException`.
337    pub fn is_conflict_exception(&self) -> bool {
338        matches!(self, Self::ConflictException(_))
339    }
340    /// Returns `true` if the error kind is `CreateRecommendationTemplateError::InternalServerException`.
341    pub fn is_internal_server_exception(&self) -> bool {
342        matches!(self, Self::InternalServerException(_))
343    }
344    /// Returns `true` if the error kind is `CreateRecommendationTemplateError::ResourceNotFoundException`.
345    pub fn is_resource_not_found_exception(&self) -> bool {
346        matches!(self, Self::ResourceNotFoundException(_))
347    }
348    /// Returns `true` if the error kind is `CreateRecommendationTemplateError::ServiceQuotaExceededException`.
349    pub fn is_service_quota_exceeded_exception(&self) -> bool {
350        matches!(self, Self::ServiceQuotaExceededException(_))
351    }
352    /// Returns `true` if the error kind is `CreateRecommendationTemplateError::ThrottlingException`.
353    pub fn is_throttling_exception(&self) -> bool {
354        matches!(self, Self::ThrottlingException(_))
355    }
356    /// Returns `true` if the error kind is `CreateRecommendationTemplateError::ValidationException`.
357    pub fn is_validation_exception(&self) -> bool {
358        matches!(self, Self::ValidationException(_))
359    }
360}
361impl ::std::error::Error for CreateRecommendationTemplateError {
362    fn source(&self) -> ::std::option::Option<&(dyn ::std::error::Error + 'static)> {
363        match self {
364            Self::AccessDeniedException(_inner) => ::std::option::Option::Some(_inner),
365            Self::ConflictException(_inner) => ::std::option::Option::Some(_inner),
366            Self::InternalServerException(_inner) => ::std::option::Option::Some(_inner),
367            Self::ResourceNotFoundException(_inner) => ::std::option::Option::Some(_inner),
368            Self::ServiceQuotaExceededException(_inner) => ::std::option::Option::Some(_inner),
369            Self::ThrottlingException(_inner) => ::std::option::Option::Some(_inner),
370            Self::ValidationException(_inner) => ::std::option::Option::Some(_inner),
371            Self::Unhandled(_inner) => ::std::option::Option::Some(&*_inner.source),
372        }
373    }
374}
375impl ::std::fmt::Display for CreateRecommendationTemplateError {
376    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
377        match self {
378            Self::AccessDeniedException(_inner) => _inner.fmt(f),
379            Self::ConflictException(_inner) => _inner.fmt(f),
380            Self::InternalServerException(_inner) => _inner.fmt(f),
381            Self::ResourceNotFoundException(_inner) => _inner.fmt(f),
382            Self::ServiceQuotaExceededException(_inner) => _inner.fmt(f),
383            Self::ThrottlingException(_inner) => _inner.fmt(f),
384            Self::ValidationException(_inner) => _inner.fmt(f),
385            Self::Unhandled(_inner) => {
386                if let ::std::option::Option::Some(code) = ::aws_smithy_types::error::metadata::ProvideErrorMetadata::code(self) {
387                    write!(f, "unhandled error ({code})")
388                } else {
389                    f.write_str("unhandled error")
390                }
391            }
392        }
393    }
394}
395impl ::aws_smithy_types::retry::ProvideErrorKind for CreateRecommendationTemplateError {
396    fn code(&self) -> ::std::option::Option<&str> {
397        ::aws_smithy_types::error::metadata::ProvideErrorMetadata::code(self)
398    }
399    fn retryable_error_kind(&self) -> ::std::option::Option<::aws_smithy_types::retry::ErrorKind> {
400        ::std::option::Option::None
401    }
402}
403impl ::aws_smithy_types::error::metadata::ProvideErrorMetadata for CreateRecommendationTemplateError {
404    fn meta(&self) -> &::aws_smithy_types::error::ErrorMetadata {
405        match self {
406            Self::AccessDeniedException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
407            Self::ConflictException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
408            Self::InternalServerException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
409            Self::ResourceNotFoundException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
410            Self::ServiceQuotaExceededException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
411            Self::ThrottlingException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
412            Self::ValidationException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
413            Self::Unhandled(_inner) => &_inner.meta,
414        }
415    }
416}
417impl ::aws_smithy_runtime_api::client::result::CreateUnhandledError for CreateRecommendationTemplateError {
418    fn create_unhandled_error(
419        source: ::std::boxed::Box<dyn ::std::error::Error + ::std::marker::Send + ::std::marker::Sync + 'static>,
420        meta: ::std::option::Option<::aws_smithy_types::error::ErrorMetadata>,
421    ) -> Self {
422        Self::Unhandled(crate::error::sealed_unhandled::Unhandled {
423            source,
424            meta: meta.unwrap_or_default(),
425        })
426    }
427}
428impl ::aws_types::request_id::RequestId for crate::operation::create_recommendation_template::CreateRecommendationTemplateError {
429    fn request_id(&self) -> Option<&str> {
430        self.meta().request_id()
431    }
432}
433
434pub use crate::operation::create_recommendation_template::_create_recommendation_template_output::CreateRecommendationTemplateOutput;
435
436pub use crate::operation::create_recommendation_template::_create_recommendation_template_input::CreateRecommendationTemplateInput;
437
438mod _create_recommendation_template_input;
439
440mod _create_recommendation_template_output;
441
442/// Builders
443pub mod builders;