aws_sdk_codepipeline/
client_idempotency_token.rs1use 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}