diff --git a/Makefile b/Makefile index 544d08b7..58eb2a9c 100644 --- a/Makefile +++ b/Makefile @@ -101,6 +101,7 @@ check-event-features: cargo test --package aws_lambda_events --no-default-features --features sns cargo test --package aws_lambda_events --no-default-features --features sqs cargo test --package aws_lambda_events --no-default-features --features streams + cargo test --package aws_lambda_events --no-default-features --features eventbridge fmt: cargo +nightly fmt --all \ No newline at end of file diff --git a/lambda-events/Cargo.toml b/lambda-events/Cargo.toml index 73ab06d8..b7a00b29 100644 --- a/lambda-events/Cargo.toml +++ b/lambda-events/Cargo.toml @@ -76,6 +76,7 @@ default = [ "sns", "sqs", "streams", + "eventbridge", ] activemq = [] @@ -117,3 +118,4 @@ ses = ["chrono"] sns = ["chrono", "serde_with"] sqs = ["serde_with"] streams = [] +eventbridge = ["chrono", "serde_with"] diff --git a/lambda-events/src/event/eventbridge/mod.rs b/lambda-events/src/event/eventbridge/mod.rs new file mode 100644 index 00000000..7809f1e2 --- /dev/null +++ b/lambda-events/src/event/eventbridge/mod.rs @@ -0,0 +1,87 @@ +use chrono::{DateTime, Utc}; +use serde::de::DeserializeOwned; +use serde::{Deserialize, Serialize}; +use serde_with::serde_as; + +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] +#[serde(rename_all = "kebab-case")] +pub struct EventBridgeEvent { + #[serde(default)] + pub version: Option, + #[serde(default)] + pub id: Option, + pub detail_type: String, + pub source: String, + #[serde(default)] + pub account: Option, + #[serde(default)] + pub time: Option>, + #[serde(default)] + pub region: Option, + #[serde(default)] + pub resources: Option>, + #[serde(default)] + pub detail: Option, +} + +#[serde_with::serde_as] +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] +#[serde(bound(deserialize = "T: DeserializeOwned"))] +#[serde(rename_all = "kebab-case")] +pub struct EventBridgeEventObj { + #[serde(default)] + pub version: Option, + #[serde(default)] + pub id: Option, + pub detail_type: String, + pub source: String, + #[serde(default)] + pub account: Option, + #[serde(default)] + pub time: Option>, + #[serde(default)] + pub region: Option, + #[serde(default)] + pub resources: Option>, + #[serde_as(as = "serde_with::json::JsonString")] + #[serde(bound(deserialize = "T: DeserializeOwned"))] + pub detail: T, +} + +#[cfg(test)] +#[cfg(feature = "eventbridge")] +mod test { + use super::*; + + use serde_json; + + #[test] + fn example_eventbridge_obj_event() { + #[derive(Serialize, Deserialize, Debug, Eq, PartialEq)] + struct CustomStruct { + a: String, + b: String, + } + + let data = include_bytes!("../../fixtures/example-eventbridge-event-obj.json"); + let parsed: EventBridgeEventObj = serde_json::from_slice(data).unwrap(); + + assert_eq!(parsed.detail.a, "123"); + assert_eq!(parsed.detail.b, "456"); + + let output: String = serde_json::to_string(&parsed).unwrap(); + let reparsed: EventBridgeEventObj = serde_json::from_slice(output.as_bytes()).unwrap(); + assert_eq!(parsed, reparsed); + } + + #[test] + fn example_eventbridge_event() { + let data = include_bytes!("../../fixtures/example-eventbridge-event.json"); + let parsed: EventBridgeEvent = serde_json::from_slice(data).unwrap(); + assert_eq!(parsed.detail, Some(String::from("String Message"))); + + let output: String = serde_json::to_string(&parsed).unwrap(); + let reparsed: EventBridgeEvent = serde_json::from_slice(output.as_bytes()).unwrap(); + assert_eq!(parsed, reparsed); + } +} diff --git a/lambda-events/src/event/mod.rs b/lambda-events/src/event/mod.rs index 4ce71dfc..46dc760c 100644 --- a/lambda-events/src/event/mod.rs +++ b/lambda-events/src/event/mod.rs @@ -140,3 +140,7 @@ pub mod sqs; /// AWS Lambda event definitions for streams. #[cfg(feature = "streams")] pub mod streams; + +/// AWS Lambda event definitions for EventBridge. +#[cfg(feature = "eventbridge")] +pub mod eventbridge; diff --git a/lambda-events/src/fixtures/example-eventbridge-event-obj.json b/lambda-events/src/fixtures/example-eventbridge-event-obj.json new file mode 100644 index 00000000..97c5e0ae --- /dev/null +++ b/lambda-events/src/fixtures/example-eventbridge-event-obj.json @@ -0,0 +1,13 @@ +{ + "version": "0", + "id": "6a7e8feb-b491-4cf7-a9f1-bf3703467718", + "detail-type": "EC2 Instance State-change Notification", + "source": "aws.ec2", + "account": "111122223333", + "time": "2017-12-22T18:43:48Z", + "region": "us-west-1", + "resources": [ + "arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0" + ], + "detail": "{\"a\":\"123\",\"b\":\"456\"}" +} diff --git a/lambda-events/src/fixtures/example-eventbridge-event.json b/lambda-events/src/fixtures/example-eventbridge-event.json new file mode 100644 index 00000000..793ca8dc --- /dev/null +++ b/lambda-events/src/fixtures/example-eventbridge-event.json @@ -0,0 +1,13 @@ +{ + "version": "0", + "id": "6a7e8feb-b491-4cf7-a9f1-bf3703467718", + "detail-type": "EC2 Instance State-change Notification", + "source": "aws.ec2", + "account": "111122223333", + "time": "2017-12-22T18:43:48Z", + "region": "us-west-1", + "resources": [ + "arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0" + ], + "detail": "String Message" +} diff --git a/lambda-events/src/lib.rs b/lambda-events/src/lib.rs index 7402a8f4..5fe81cfc 100644 --- a/lambda-events/src/lib.rs +++ b/lambda-events/src/lib.rs @@ -164,3 +164,7 @@ pub use event::sqs; /// AWS Lambda event definitions for streams. #[cfg(feature = "streams")] pub use event::streams; + +/// AWS Lambda event definitions for EventBridge. +#[cfg(feature = "eventbridge")] +pub use event::eventbridge;