11use chrono:: { DateTime , Utc } ;
22use serde:: de:: DeserializeOwned ;
33use serde:: { Deserialize , Serialize } ;
4- use serde_with:: serde_as;
54
6- #[ derive( Clone , Debug , Default , Deserialize , Eq , PartialEq , Serialize ) ]
7- #[ serde( rename_all = "kebab-case" ) ]
8- pub struct EventBridgeEvent {
9- #[ serde( default ) ]
10- pub version : Option < String > ,
11- #[ serde( default ) ]
12- pub id : Option < String > ,
13- pub detail_type : String ,
14- pub source : String ,
15- #[ serde( default ) ]
16- pub account : Option < String > ,
17- #[ serde( default ) ]
18- pub time : Option < DateTime < Utc > > ,
19- #[ serde( default ) ]
20- pub region : Option < String > ,
21- #[ serde( default ) ]
22- pub resources : Option < Vec < String > > ,
23- #[ serde( default ) ]
24- pub detail : Option < String > ,
25- }
26-
27- #[ serde_with:: serde_as]
5+ /// Parse EventBridge events.
6+ /// Deserialize the event detail into a structure that's `DeserializeOwned`.
7+ ///
8+ /// See https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events-structure.html for structure details.
289#[ derive( Clone , Debug , Default , Deserialize , Eq , PartialEq , Serialize ) ]
2910#[ serde( bound( deserialize = "T: DeserializeOwned" ) ) ]
3011#[ serde( rename_all = "kebab-case" ) ]
31- pub struct EventBridgeEventObj < T : Serialize > {
12+ pub struct EventBridgeEvent < T : Serialize > {
3213 #[ serde( default ) ]
3314 pub version : Option < String > ,
3415 #[ serde( default ) ]
@@ -43,7 +24,6 @@ pub struct EventBridgeEventObj<T: Serialize> {
4324 pub region : Option < String > ,
4425 #[ serde( default ) ]
4526 pub resources : Option < Vec < String > > ,
46- #[ serde_as( as = "serde_with::json::JsonString" ) ]
4727 #[ serde( bound( deserialize = "T: DeserializeOwned" ) ) ]
4828 pub detail : T ,
4929}
@@ -53,35 +33,24 @@ pub struct EventBridgeEventObj<T: Serialize> {
5333mod test {
5434 use super :: * ;
5535
56- use serde_json;
57-
5836 #[ test]
5937 fn example_eventbridge_obj_event ( ) {
6038 #[ derive( Serialize , Deserialize , Debug , Eq , PartialEq ) ]
61- struct CustomStruct {
62- a : String ,
63- b : String ,
39+ #[ serde( rename_all = "kebab-case" ) ]
40+ struct Ec2StateChange {
41+ instance_id : String ,
42+ state : String ,
6443 }
6544
45+ // Example from https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-instance-state-changes.html
6646 let data = include_bytes ! ( "../../fixtures/example-eventbridge-event-obj.json" ) ;
67- let parsed: EventBridgeEventObj < CustomStruct > = serde_json:: from_slice ( data) . unwrap ( ) ;
47+ let parsed: EventBridgeEvent < Ec2StateChange > = serde_json:: from_slice ( data) . unwrap ( ) ;
6848
69- assert_eq ! ( parsed. detail. a, "123" ) ;
70- assert_eq ! ( parsed. detail. b, "456" ) ;
71-
72- let output: String = serde_json:: to_string ( & parsed) . unwrap ( ) ;
73- let reparsed: EventBridgeEventObj < CustomStruct > = serde_json:: from_slice ( output. as_bytes ( ) ) . unwrap ( ) ;
74- assert_eq ! ( parsed, reparsed) ;
75- }
76-
77- #[ test]
78- fn example_eventbridge_event ( ) {
79- let data = include_bytes ! ( "../../fixtures/example-eventbridge-event.json" ) ;
80- let parsed: EventBridgeEvent = serde_json:: from_slice ( data) . unwrap ( ) ;
81- assert_eq ! ( parsed. detail, Some ( String :: from( "String Message" ) ) ) ;
49+ assert_eq ! ( "i-abcd1111" , parsed. detail. instance_id) ;
50+ assert_eq ! ( "pending" , parsed. detail. state) ;
8251
8352 let output: String = serde_json:: to_string ( & parsed) . unwrap ( ) ;
84- let reparsed: EventBridgeEvent = serde_json:: from_slice ( output. as_bytes ( ) ) . unwrap ( ) ;
53+ let reparsed: EventBridgeEvent < Ec2StateChange > = serde_json:: from_slice ( output. as_bytes ( ) ) . unwrap ( ) ;
8554 assert_eq ! ( parsed, reparsed) ;
8655 }
8756}
0 commit comments