1#![deny(warnings, unconditional_panic)]
5#![deny(nonstandard_style)]
6#![deny(clippy::all)]
7#![allow(unused)]
8#![allow(clippy::result_large_err)]
9
10use aws_sdk_dynamodb::{
11 config::{
12 interceptors::{BeforeSerializationInterceptorContextMut, FinalizerInterceptorContextMut},
13 ConfigBag, Intercept, RuntimeComponents,
14 },
15 error::BoxError,
16};
17use aws_smithy_runtime_api::client::interceptors::context::Input;
18use aws_smithy_types::config_bag::{Storable, StoreReplace};
19
20macro_rules! modify_request {
21 ($cfg:ident,$request:ident,$self:ident,$transform:ident) => {{
22 $cfg.interceptor_state()
24 .store_put(OriginalRequest(Input::erase($request.clone())));
25
26 let result = tokio::task::block_in_place(|| {
28 tokio::runtime::Handle::current().block_on(async {
29 $self
30 .client
31 .$transform()
32 .sdk_input($request.clone())
33 .send()
34 .await
35 })
36 });
37 match result {
38 Ok(x) => *$request = x.transformed_input.unwrap(),
39 Err(x) => {
40 let s = format!("{:?}", x);
41 return Err(s.into());
42 }
43 };
44 }};
45}
46
47macro_rules! modify_response {
48 ($cfg:ident,$type:ty,$response:ident,$self:ident,$transform:ident) => {{
49 let original = $cfg
51 .load::<OriginalRequest>()
52 .expect("we put this in ourselves");
53 let original = original
54 .0
55 .downcast_ref::<$type>()
56 .expect("we know this type corresponds to the output type");
57
58 let result = tokio::task::block_in_place(|| {
60 tokio::runtime::Handle::current().block_on(async {
61 $self
62 .client
63 .$transform()
64 .original_input(original.clone())
65 .sdk_output($response.clone())
66 .send()
67 .await
68 })
69 });
70 match result {
71 Ok(x) => *$response = x.transformed_output.unwrap(),
72 Err(x) => {
73 let s = format!("{:?}", x);
74 return Err(s.into());
75 }
76 };
77 }};
78}
79
80#[derive(Debug)]
81pub struct DbEsdkInterceptor {
82 client: crate::client::Client,
83}
84
85impl DbEsdkInterceptor {
86 pub fn new(
87 config: crate::types::dynamo_db_tables_encryption_config::DynamoDbTablesEncryptionConfig,
88 ) -> Result<Self, crate::types::error::Error> {
89 let client = crate::client::Client::from_conf(config)?;
90 Ok(DbEsdkInterceptor { client })
91 }
92}
93
94#[derive(Debug)]
95struct OriginalRequest(Input);
96
97impl Storable for OriginalRequest {
98 type Storer = StoreReplace<Self>;
99}
100
101impl Intercept for DbEsdkInterceptor {
102 fn name(&self) -> &'static str {
103 "DbEsdkInterceptor"
104 }
105
106 fn modify_before_serialization(
107 &self,
108 context: &mut BeforeSerializationInterceptorContextMut,
110 _rc: &RuntimeComponents,
111 cfg: &mut ConfigBag,
112 ) -> Result<(), BoxError> {
113 if let Some(batch_execute_statement_request) = context.input_mut().downcast_mut::<aws_sdk_dynamodb::operation::batch_execute_statement::BatchExecuteStatementInput>() {
114 modify_request!(cfg, batch_execute_statement_request, self, batch_execute_statement_input_transform);
115 } else if let Some(batch_get_item_request) = context.input_mut().downcast_mut::<aws_sdk_dynamodb::operation::batch_get_item::BatchGetItemInput>() {
116 modify_request!(cfg, batch_get_item_request, self, batch_get_item_input_transform);
117 } else if let Some(batch_write_item_request) = context.input_mut().downcast_mut::<aws_sdk_dynamodb::operation::batch_write_item::BatchWriteItemInput>() {
118 modify_request!(cfg, batch_write_item_request, self, batch_write_item_input_transform);
119 } else if let Some(delete_item_request) = context.input_mut().downcast_mut::<aws_sdk_dynamodb::operation::delete_item::DeleteItemInput>() {
120 modify_request!(cfg, delete_item_request, self, delete_item_input_transform);
121 } else if let Some(execute_statement_request) = context.input_mut().downcast_mut::<aws_sdk_dynamodb::operation::execute_statement::ExecuteStatementInput>() {
122 modify_request!(cfg, execute_statement_request, self, execute_statement_input_transform);
123 } else if let Some(execute_transaction_request) = context.input_mut().downcast_mut::<aws_sdk_dynamodb::operation::execute_transaction::ExecuteTransactionInput>() {
124 modify_request!(cfg, execute_transaction_request, self, execute_transaction_input_transform);
125 } else if let Some(get_item_request) = context.input_mut().downcast_mut::<aws_sdk_dynamodb::operation::get_item::GetItemInput>() {
126 modify_request!(cfg, get_item_request, self, get_item_input_transform);
127 } else if let Some(put_item_request) = context.input_mut().downcast_mut::<aws_sdk_dynamodb::operation::put_item::PutItemInput>() {
128 modify_request!(cfg, put_item_request, self, put_item_input_transform);
129 } else if let Some(query_request) = context.input_mut().downcast_mut::<aws_sdk_dynamodb::operation::query::QueryInput>() {
130 modify_request!(cfg, query_request, self, query_input_transform);
131 } else if let Some(scan_request) = context.input_mut().downcast_mut::<aws_sdk_dynamodb::operation::scan::ScanInput>() {
132 modify_request!(cfg, scan_request, self, scan_input_transform);
133 } else if let Some(transact_get_items_request) = context.input_mut().downcast_mut::<aws_sdk_dynamodb::operation::transact_get_items::TransactGetItemsInput>() {
134 modify_request!(cfg, transact_get_items_request, self, transact_get_items_input_transform);
135 } else if let Some(transact_write_items_request) = context.input_mut().downcast_mut::<aws_sdk_dynamodb::operation::transact_write_items::TransactWriteItemsInput>() {
136 modify_request!(cfg, transact_write_items_request, self, transact_write_items_input_transform);
137 } else if let Some(update_item_request) = context.input_mut().downcast_mut::<aws_sdk_dynamodb::operation::update_item::UpdateItemInput>() {
138 modify_request!(cfg, update_item_request, self, update_item_input_transform);
139 }
140 Ok(())
141 }
142
143 fn modify_before_attempt_completion(
144 &self,
145 context: &mut FinalizerInterceptorContextMut,
146 _rc: &RuntimeComponents,
147 cfg: &mut ConfigBag,
148 ) -> Result<(), BoxError> {
149 if let Some(Ok(output)) = context.output_or_error_mut() {
150 if let Some(batch_execute_statement_response) = output.downcast_mut::<aws_sdk_dynamodb::operation::batch_execute_statement::BatchExecuteStatementOutput>() {
151 modify_response!(cfg, aws_sdk_dynamodb::operation::batch_execute_statement::BatchExecuteStatementInput, batch_execute_statement_response, self, batch_execute_statement_output_transform);
152 } else if let Some(batch_get_item_response) = output.downcast_mut::<aws_sdk_dynamodb::operation::batch_get_item::BatchGetItemOutput>() {
153 modify_response!(cfg, aws_sdk_dynamodb::operation::batch_get_item::BatchGetItemInput, batch_get_item_response, self, batch_get_item_output_transform);
154 } else if let Some(batch_write_item_response) = output.downcast_mut::<aws_sdk_dynamodb::operation::batch_write_item::BatchWriteItemOutput>() {
155 modify_response!(cfg, aws_sdk_dynamodb::operation::batch_write_item::BatchWriteItemInput, batch_write_item_response, self, batch_write_item_output_transform);
156 } else if let Some(delete_item_response) = output.downcast_mut::<aws_sdk_dynamodb::operation::delete_item::DeleteItemOutput>() {
157 modify_response!(cfg, aws_sdk_dynamodb::operation::delete_item::DeleteItemInput, delete_item_response, self, delete_item_output_transform);
158 } else if let Some(execute_statement_response) = output.downcast_mut::<aws_sdk_dynamodb::operation::execute_statement::ExecuteStatementOutput>() {
159 modify_response!(cfg, aws_sdk_dynamodb::operation::execute_statement::ExecuteStatementInput, execute_statement_response, self, execute_statement_output_transform);
160 } else if let Some(execute_transaction_response) = output.downcast_mut::<aws_sdk_dynamodb::operation::execute_transaction::ExecuteTransactionOutput>() {
161 modify_response!(cfg, aws_sdk_dynamodb::operation::execute_transaction::ExecuteTransactionInput, execute_transaction_response, self, execute_transaction_output_transform);
162 } else if let Some(get_item_response) = output.downcast_mut::<aws_sdk_dynamodb::operation::get_item::GetItemOutput>() {
163 modify_response!(cfg, aws_sdk_dynamodb::operation::get_item::GetItemInput, get_item_response, self, get_item_output_transform);
164 } else if let Some(put_item_response) = output.downcast_mut::<aws_sdk_dynamodb::operation::put_item::PutItemOutput>() {
165 modify_response!(cfg, aws_sdk_dynamodb::operation::put_item::PutItemInput, put_item_response, self, put_item_output_transform);
166 } else if let Some(query_response) = output.downcast_mut::<aws_sdk_dynamodb::operation::query::QueryOutput>() {
167 modify_response!(cfg, aws_sdk_dynamodb::operation::query::QueryInput, query_response, self, query_output_transform);
168 } else if let Some(scan_response) = output.downcast_mut::<aws_sdk_dynamodb::operation::scan::ScanOutput>() {
169 modify_response!(cfg, aws_sdk_dynamodb::operation::scan::ScanInput, scan_response, self, scan_output_transform);
170 } else if let Some(transact_get_items_response) = output.downcast_mut::<aws_sdk_dynamodb::operation::transact_get_items::TransactGetItemsOutput>() {
171 modify_response!(cfg, aws_sdk_dynamodb::operation::transact_get_items::TransactGetItemsInput, transact_get_items_response, self, transact_get_items_output_transform);
172 } else if let Some(transact_write_items_response) = output.downcast_mut::<aws_sdk_dynamodb::operation::transact_write_items::TransactWriteItemsOutput>() {
173 modify_response!(cfg, aws_sdk_dynamodb::operation::transact_write_items::TransactWriteItemsInput, transact_write_items_response, self, transact_write_items_output_transform);
174 } else if let Some(update_item_response) = output.downcast_mut::<aws_sdk_dynamodb::operation::update_item::UpdateItemOutput>() {
175 modify_response!(cfg, aws_sdk_dynamodb::operation::update_item::UpdateItemInput, update_item_response, self, update_item_output_transform);
176 }
177 }
178 Ok(())
179 }
180}