#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LambdaEvent {
Http,
Sqs,
Unknown,
}
pub fn classify_event(event: &serde_json::Value) -> LambdaEvent {
if is_sqs_event_shape(event) {
return LambdaEvent::Sqs;
}
if is_http_event_shape(event) {
return LambdaEvent::Http;
}
LambdaEvent::Unknown
}
fn is_sqs_event_shape(event: &serde_json::Value) -> bool {
event
.get("Records")
.and_then(|r| r.as_array())
.and_then(|arr| arr.first())
.and_then(|rec| rec.get("eventSource"))
.and_then(|s| s.as_str())
.map(|s| s == "aws:sqs")
.unwrap_or(false)
}
fn is_http_event_shape(event: &serde_json::Value) -> bool {
if event.get("httpMethod").is_some() {
return true;
}
if let Some(req_ctx) = event.get("requestContext") {
if req_ctx.pointer("/http/method").is_some() {
return true;
}
}
if event.get("routeKey").is_some() {
return true;
}
false
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn classify_apigw_v2_http_event() {
let v = serde_json::json!({
"version": "2.0",
"routeKey": "GET /.well-known/agent-card.json",
"requestContext": {
"http": {"method": "GET", "path": "/.well-known/agent-card.json"}
}
});
assert_eq!(classify_event(&v), LambdaEvent::Http);
}
#[test]
fn classify_apigw_v1_http_event() {
let v = serde_json::json!({
"httpMethod": "POST",
"path": "/message:send",
"resource": "/{proxy+}"
});
assert_eq!(classify_event(&v), LambdaEvent::Http);
}
#[test]
fn classify_sqs_event() {
let v = serde_json::json!({
"Records": [
{"eventSource": "aws:sqs", "messageId": "m1", "body": "{}"}
]
});
assert_eq!(classify_event(&v), LambdaEvent::Sqs);
}
#[test]
fn classify_eventbridge_scheduled_is_unknown() {
let v = serde_json::json!({
"source": "aws.events",
"detail-type": "Scheduled Event",
"detail": {}
});
assert_eq!(classify_event(&v), LambdaEvent::Unknown);
}
#[test]
fn classify_dynamodb_stream_is_unknown_not_sqs() {
let v = serde_json::json!({
"Records": [
{"eventSource": "aws:dynamodb", "dynamodb": {}}
]
});
assert_eq!(classify_event(&v), LambdaEvent::Unknown);
}
#[test]
fn classify_unknown_payload() {
let v = serde_json::json!({"custom": "invoke"});
assert_eq!(classify_event(&v), LambdaEvent::Unknown);
}
}