@@ -112,6 +112,74 @@ pub struct BatchItemFailure {
112
112
pub item_identifier : String ,
113
113
}
114
114
115
+ /// The Event sent to Lambda from the SQS API. Contains 1 or more individual SQS Messages
116
+ #[ derive( Clone , Debug , Default , Deserialize , Eq , PartialEq , Serialize ) ]
117
+ #[ serde( rename_all = "PascalCase" ) ]
118
+ #[ serde( bound( deserialize = "T: DeserializeOwned" ) ) ]
119
+ pub struct SqsApiEventObj < T : Serialize > {
120
+ #[ serde( bound( deserialize = "T: DeserializeOwned" ) ) ]
121
+ pub messages : Vec < SqsApiMessageObj < T > > ,
122
+ }
123
+
124
+ /// The Event sent to Lambda from SQS API. Contains 1 or more individual SQS Messages
125
+ #[ derive( Clone , Debug , Default , Deserialize , Eq , PartialEq , Serialize ) ]
126
+ #[ serde( rename_all = "camelCase" ) ]
127
+ pub struct SqsApiEvent {
128
+ pub messages : Vec < SqsApiMessage > ,
129
+ }
130
+
131
+ /// Alternative to SqsApiEvent to be used alongside SqsApiMessageObj<T> when you need to
132
+ /// deserialize a nested object into a struct of type T within the SQS Message rather
133
+ /// than just using the raw SQS Message string
134
+ #[ serde_with:: serde_as]
135
+ #[ derive( Clone , Debug , Default , Deserialize , Eq , PartialEq , Serialize ) ]
136
+ #[ serde( bound( deserialize = "T: DeserializeOwned" ) ) ]
137
+ #[ serde( rename_all = "PascalCase" ) ]
138
+ pub struct SqsApiMessageObj < T : Serialize > {
139
+ /// nolint: stylecheck
140
+ #[ serde( default ) ]
141
+ pub message_id : Option < String > ,
142
+ #[ serde( default ) ]
143
+ pub receipt_handle : Option < String > ,
144
+ /// Deserialized into a `T` from nested JSON inside the SQS body string. `T` must implement the `Deserialize` or `DeserializeOwned` trait.
145
+ #[ serde_as( as = "serde_with::json::JsonString" ) ]
146
+ #[ serde( bound( deserialize = "T: DeserializeOwned" ) ) ]
147
+ pub body : T ,
148
+ #[ serde( default ) ]
149
+ pub md5_of_body : Option < String > ,
150
+ #[ serde( default ) ]
151
+ pub md5_of_message_attributes : Option < String > ,
152
+ #[ serde( deserialize_with = "deserialize_lambda_map" ) ]
153
+ #[ serde( default ) ]
154
+ pub attributes : HashMap < String , String > ,
155
+ #[ serde( deserialize_with = "deserialize_lambda_map" ) ]
156
+ #[ serde( default ) ]
157
+ pub message_attributes : HashMap < String , SqsMessageAttribute > ,
158
+ }
159
+
160
+ /// An individual SQS API Message, its metadata, and Message Attributes
161
+ #[ derive( Clone , Debug , Default , Deserialize , Eq , PartialEq , Serialize ) ]
162
+ #[ serde( rename_all = "PascalCase" ) ]
163
+ pub struct SqsApiMessage {
164
+ /// nolint: stylecheck
165
+ #[ serde( default ) ]
166
+ pub message_id : Option < String > ,
167
+ #[ serde( default ) ]
168
+ pub receipt_handle : Option < String > ,
169
+ #[ serde( default ) ]
170
+ pub body : Option < String > ,
171
+ #[ serde( default ) ]
172
+ pub md5_of_body : Option < String > ,
173
+ #[ serde( default ) ]
174
+ pub md5_of_message_attributes : Option < String > ,
175
+ #[ serde( deserialize_with = "deserialize_lambda_map" ) ]
176
+ #[ serde( default ) ]
177
+ pub attributes : HashMap < String , String > ,
178
+ #[ serde( deserialize_with = "deserialize_lambda_map" ) ]
179
+ #[ serde( default ) ]
180
+ pub message_attributes : HashMap < String , SqsMessageAttribute > ,
181
+ }
182
+
115
183
#[ cfg( test) ]
116
184
mod test {
117
185
use super :: * ;
@@ -159,4 +227,26 @@ mod test {
159
227
let reparsed: SqsBatchResponse = serde_json:: from_slice ( output. as_bytes ( ) ) . unwrap ( ) ;
160
228
assert_eq ! ( parsed, reparsed) ;
161
229
}
230
+
231
+ #[ test]
232
+ #[ cfg( feature = "sqs" ) ]
233
+ fn example_sqs_api_obj_event ( ) {
234
+ // Example sqs api receive message response, fetched 2023-10-23, inspired from:
235
+ // https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html#API_ReceiveMessage_ResponseSyntax
236
+ #[ derive( Serialize , Deserialize , Debug , Eq , PartialEq ) ]
237
+ struct CustStruct {
238
+ city : String ,
239
+ country : String ,
240
+ }
241
+
242
+ let data = include_bytes ! ( "../../fixtures/example-sqs-api-event-obj.json" ) ;
243
+ let parsed: SqsApiEventObj < CustStruct > = serde_json:: from_slice ( data) . unwrap ( ) ;
244
+
245
+ assert_eq ! ( parsed. messages[ 0 ] . body. city, "provincetown" ) ;
246
+ assert_eq ! ( parsed. messages[ 0 ] . body. country, "usa" ) ;
247
+
248
+ let output: String = serde_json:: to_string ( & parsed) . unwrap ( ) ;
249
+ let reparsed: SqsApiEventObj < CustStruct > = serde_json:: from_slice ( output. as_bytes ( ) ) . unwrap ( ) ;
250
+ assert_eq ! ( parsed, reparsed) ;
251
+ }
162
252
}
0 commit comments