aws_sdk_codepipeline/
client_idempotency_token.rs

1// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
2/*
3 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7use std::borrow::Cow;
8use std::fmt;
9
10use aws_smithy_runtime_api::box_error::BoxError;
11use aws_smithy_runtime_api::client::interceptors::context::{BeforeSerializationInterceptorContextMut, Input};
12use aws_smithy_runtime_api::client::interceptors::{Intercept, SharedInterceptor};
13use aws_smithy_runtime_api::client::runtime_components::{RuntimeComponents, RuntimeComponentsBuilder};
14use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin;
15use aws_smithy_types::config_bag::ConfigBag;
16
17use crate::idempotency_token::IdempotencyTokenProvider;
18
19#[derive(Debug)]
20pub(crate) struct IdempotencyTokenRuntimePlugin {
21    runtime_components: RuntimeComponentsBuilder,
22}
23
24impl IdempotencyTokenRuntimePlugin {
25    pub(crate) fn new<S>(set_token: S) -> Self
26    where
27        S: Fn(IdempotencyTokenProvider, &mut Input) + Send + Sync + 'static,
28    {
29        Self {
30            runtime_components: RuntimeComponentsBuilder::new("IdempotencyTokenRuntimePlugin")
31                .with_interceptor(SharedInterceptor::new(IdempotencyTokenInterceptor { set_token })),
32        }
33    }
34}
35
36impl RuntimePlugin for IdempotencyTokenRuntimePlugin {
37    fn runtime_components(&self, _: &RuntimeComponentsBuilder) -> Cow<'_, RuntimeComponentsBuilder> {
38        Cow::Borrowed(&self.runtime_components)
39    }
40}
41
42struct IdempotencyTokenInterceptor<S> {
43    set_token: S,
44}
45
46impl<S> fmt::Debug for IdempotencyTokenInterceptor<S> {
47    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
48        f.debug_struct("IdempotencyTokenInterceptor").finish()
49    }
50}
51
52impl<S> Intercept for IdempotencyTokenInterceptor<S>
53where
54    S: Fn(IdempotencyTokenProvider, &mut Input) + Send + Sync,
55{
56    fn name(&self) -> &'static str {
57        "IdempotencyTokenInterceptor"
58    }
59
60    fn modify_before_serialization(
61        &self,
62        context: &mut BeforeSerializationInterceptorContextMut<'_>,
63        _runtime_components: &RuntimeComponents,
64        cfg: &mut ConfigBag,
65    ) -> Result<(), BoxError> {
66        let token_provider = cfg
67            .load::<IdempotencyTokenProvider>()
68            .expect("the idempotency provider must be set")
69            .clone();
70        (self.set_token)(token_provider, context.input_mut());
71        Ok(())
72    }
73}