1
1
use chrono:: { DateTime , Utc } ;
2
2
use serde:: de:: DeserializeOwned ;
3
3
use serde:: { Deserialize , Serialize } ;
4
- use serde_with:: serde_as;
5
4
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.
28
9
#[ derive( Clone , Debug , Default , Deserialize , Eq , PartialEq , Serialize ) ]
29
10
#[ serde( bound( deserialize = "T: DeserializeOwned" ) ) ]
30
11
#[ serde( rename_all = "kebab-case" ) ]
31
- pub struct EventBridgeEventObj < T : Serialize > {
12
+ pub struct EventBridgeEvent < T : Serialize > {
32
13
#[ serde( default ) ]
33
14
pub version : Option < String > ,
34
15
#[ serde( default ) ]
@@ -43,7 +24,6 @@ pub struct EventBridgeEventObj<T: Serialize> {
43
24
pub region : Option < String > ,
44
25
#[ serde( default ) ]
45
26
pub resources : Option < Vec < String > > ,
46
- #[ serde_as( as = "serde_with::json::JsonString" ) ]
47
27
#[ serde( bound( deserialize = "T: DeserializeOwned" ) ) ]
48
28
pub detail : T ,
49
29
}
@@ -53,35 +33,24 @@ pub struct EventBridgeEventObj<T: Serialize> {
53
33
mod test {
54
34
use super :: * ;
55
35
56
- use serde_json;
57
-
58
36
#[ test]
59
37
fn example_eventbridge_obj_event ( ) {
60
38
#[ 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 ,
64
43
}
65
44
45
+ // Example from https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-instance-state-changes.html
66
46
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 ( ) ;
68
48
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) ;
82
51
83
52
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 ( ) ;
85
54
assert_eq ! ( parsed, reparsed) ;
86
55
}
87
56
}
0 commit comments