Skip to content

Commit bcd3f97

Browse files
nichmorganmorgan1371EduardoRSO
authored
Eventbridge Event Processor (#704)
* Eventbridge Event Processor * cfg feature fix * feature comment * Removed whitespace * makefile fix --------- Co-authored-by: nich.morgan <morgannicholson1371@gmail.com> Co-authored-by: erso <edusillva784@gmail.com>
1 parent 1cbe34b commit bcd3f97

File tree

7 files changed

+124
-0
lines changed

7 files changed

+124
-0
lines changed

Makefile

+1
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ check-event-features:
101101
cargo test --package aws_lambda_events --no-default-features --features sns
102102
cargo test --package aws_lambda_events --no-default-features --features sqs
103103
cargo test --package aws_lambda_events --no-default-features --features streams
104+
cargo test --package aws_lambda_events --no-default-features --features eventbridge
104105

105106
fmt:
106107
cargo +nightly fmt --all

lambda-events/Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ default = [
7676
"sns",
7777
"sqs",
7878
"streams",
79+
"eventbridge",
7980
]
8081

8182
activemq = []
@@ -117,3 +118,4 @@ ses = ["chrono"]
117118
sns = ["chrono", "serde_with"]
118119
sqs = ["serde_with"]
119120
streams = []
121+
eventbridge = ["chrono", "serde_with"]
+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
use chrono::{DateTime, Utc};
2+
use serde::de::DeserializeOwned;
3+
use serde::{Deserialize, Serialize};
4+
use serde_with::serde_as;
5+
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]
28+
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
29+
#[serde(bound(deserialize = "T: DeserializeOwned"))]
30+
#[serde(rename_all = "kebab-case")]
31+
pub struct EventBridgeEventObj<T: Serialize> {
32+
#[serde(default)]
33+
pub version: Option<String>,
34+
#[serde(default)]
35+
pub id: Option<String>,
36+
pub detail_type: String,
37+
pub source: String,
38+
#[serde(default)]
39+
pub account: Option<String>,
40+
#[serde(default)]
41+
pub time: Option<DateTime<Utc>>,
42+
#[serde(default)]
43+
pub region: Option<String>,
44+
#[serde(default)]
45+
pub resources: Option<Vec<String>>,
46+
#[serde_as(as = "serde_with::json::JsonString")]
47+
#[serde(bound(deserialize = "T: DeserializeOwned"))]
48+
pub detail: T,
49+
}
50+
51+
#[cfg(test)]
52+
#[cfg(feature = "eventbridge")]
53+
mod test {
54+
use super::*;
55+
56+
use serde_json;
57+
58+
#[test]
59+
fn example_eventbridge_obj_event() {
60+
#[derive(Serialize, Deserialize, Debug, Eq, PartialEq)]
61+
struct CustomStruct {
62+
a: String,
63+
b: String,
64+
}
65+
66+
let data = include_bytes!("../../fixtures/example-eventbridge-event-obj.json");
67+
let parsed: EventBridgeEventObj<CustomStruct> = serde_json::from_slice(data).unwrap();
68+
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")));
82+
83+
let output: String = serde_json::to_string(&parsed).unwrap();
84+
let reparsed: EventBridgeEvent = serde_json::from_slice(output.as_bytes()).unwrap();
85+
assert_eq!(parsed, reparsed);
86+
}
87+
}

lambda-events/src/event/mod.rs

+4
Original file line numberDiff line numberDiff line change
@@ -140,3 +140,7 @@ pub mod sqs;
140140
/// AWS Lambda event definitions for streams.
141141
#[cfg(feature = "streams")]
142142
pub mod streams;
143+
144+
/// AWS Lambda event definitions for EventBridge.
145+
#[cfg(feature = "eventbridge")]
146+
pub mod eventbridge;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"version": "0",
3+
"id": "6a7e8feb-b491-4cf7-a9f1-bf3703467718",
4+
"detail-type": "EC2 Instance State-change Notification",
5+
"source": "aws.ec2",
6+
"account": "111122223333",
7+
"time": "2017-12-22T18:43:48Z",
8+
"region": "us-west-1",
9+
"resources": [
10+
"arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"
11+
],
12+
"detail": "{\"a\":\"123\",\"b\":\"456\"}"
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"version": "0",
3+
"id": "6a7e8feb-b491-4cf7-a9f1-bf3703467718",
4+
"detail-type": "EC2 Instance State-change Notification",
5+
"source": "aws.ec2",
6+
"account": "111122223333",
7+
"time": "2017-12-22T18:43:48Z",
8+
"region": "us-west-1",
9+
"resources": [
10+
"arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"
11+
],
12+
"detail": "String Message"
13+
}

lambda-events/src/lib.rs

+4
Original file line numberDiff line numberDiff line change
@@ -164,3 +164,7 @@ pub use event::sqs;
164164
/// AWS Lambda event definitions for streams.
165165
#[cfg(feature = "streams")]
166166
pub use event::streams;
167+
168+
/// AWS Lambda event definitions for EventBridge.
169+
#[cfg(feature = "eventbridge")]
170+
pub use event::eventbridge;

0 commit comments

Comments
 (0)