use crate::{
encodings::{Base64Data, SecondTimestamp},
time_window::{TimeWindowEventResponseProperties, TimeWindowProperties},
};
#[cfg(feature = "builders")]
use bon::Builder;
use serde::{Deserialize, Serialize};
#[cfg(feature = "catch-all-fields")]
use serde_json::Value;
#[non_exhaustive]
#[cfg_attr(feature = "builders", derive(Builder))]
#[derive(Clone, Default, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct KinesisEvent {
#[serde(rename = "Records")]
pub records: Vec<KinesisEventRecord>,
#[cfg(feature = "catch-all-fields")]
#[cfg_attr(docsrs, doc(cfg(feature = "catch-all-fields")))]
#[serde(flatten)]
#[cfg_attr(feature = "builders", builder(default))]
pub other: serde_json::Map<String, Value>,
}
#[non_exhaustive]
#[cfg_attr(feature = "builders", derive(Builder))]
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct KinesisTimeWindowEvent {
#[serde(rename = "KinesisEvent")]
#[serde(flatten)]
pub kinesis_event: KinesisEvent,
#[serde(rename = "TimeWindowProperties")]
#[serde(flatten)]
pub time_window_properties: TimeWindowProperties,
#[cfg(feature = "catch-all-fields")]
#[cfg_attr(docsrs, doc(cfg(feature = "catch-all-fields")))]
#[serde(flatten)]
#[cfg_attr(feature = "builders", builder(default))]
pub other: serde_json::Map<String, Value>,
}
#[non_exhaustive]
#[cfg_attr(feature = "builders", derive(Builder))]
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct KinesisTimeWindowEventResponse {
#[serde(rename = "TimeWindowEventResponseProperties")]
#[serde(flatten)]
pub time_window_event_response_properties: TimeWindowEventResponseProperties,
#[cfg(feature = "catch-all-fields")]
#[cfg_attr(docsrs, doc(cfg(feature = "catch-all-fields")))]
#[serde(flatten)]
#[cfg_attr(feature = "builders", builder(default))]
pub other: serde_json::Map<String, Value>,
}
#[non_exhaustive]
#[cfg_attr(feature = "builders", derive(Builder))]
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct KinesisEventRecord {
#[serde(default)]
pub aws_region: Option<String>,
#[serde(default)]
#[serde(rename = "eventID")]
pub event_id: Option<String>,
#[serde(default)]
pub event_name: Option<String>,
#[serde(default)]
pub event_source: Option<String>,
#[serde(default)]
#[serde(rename = "eventSourceARN")]
pub event_source_arn: Option<String>,
#[serde(default)]
pub event_version: Option<String>,
#[serde(default)]
pub invoke_identity_arn: Option<String>,
pub kinesis: KinesisRecord,
#[cfg(feature = "catch-all-fields")]
#[cfg_attr(docsrs, doc(cfg(feature = "catch-all-fields")))]
#[serde(flatten)]
#[cfg_attr(feature = "builders", builder(default))]
pub other: serde_json::Map<String, Value>,
}
#[non_exhaustive]
#[cfg_attr(feature = "builders", derive(Builder))]
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct KinesisRecord {
pub approximate_arrival_timestamp: SecondTimestamp,
pub data: Base64Data,
#[serde(default)]
pub encryption_type: KinesisEncryptionType,
#[serde(default)]
pub partition_key: String,
#[serde(default)]
pub sequence_number: String,
#[serde(default)]
pub kinesis_schema_version: Option<String>,
#[cfg(feature = "catch-all-fields")]
#[cfg_attr(docsrs, doc(cfg(feature = "catch-all-fields")))]
#[serde(flatten)]
#[cfg_attr(feature = "builders", builder(default))]
pub other: serde_json::Map<String, Value>,
}
#[non_exhaustive]
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum KinesisEncryptionType {
#[default]
None,
Kms,
}
#[cfg(test)]
mod test {
use super::*;
#[test]
#[cfg(feature = "kinesis")]
fn example_kinesis_event() {
let data = include_bytes!("../../fixtures/example-kinesis-event.json");
let parsed: KinesisEvent = serde_json::from_slice(data).unwrap();
assert_eq!(KinesisEncryptionType::None, parsed.records[0].kinesis.encryption_type);
let output: String = serde_json::to_string(&parsed).unwrap();
let reparsed: KinesisEvent = serde_json::from_slice(output.as_bytes()).unwrap();
assert_eq!(parsed, reparsed);
}
#[test]
#[cfg(feature = "kinesis")]
fn example_kinesis_event_encrypted() {
let data = include_bytes!("../../fixtures/example-kinesis-event-encrypted.json");
let parsed: KinesisEvent = serde_json::from_slice(data).unwrap();
assert_eq!(KinesisEncryptionType::Kms, parsed.records[0].kinesis.encryption_type);
let output: String = serde_json::to_string(&parsed).unwrap();
let reparsed: KinesisEvent = serde_json::from_slice(output.as_bytes()).unwrap();
assert_eq!(parsed, reparsed);
}
#[test]
#[cfg(feature = "kinesis")]
fn test_ensure_default_implemented_for_structs() {
let _kinesis_event = KinesisEvent::default();
let _kinesis_time_window_event = KinesisTimeWindowEvent::default();
let _kinesis_event_record = KinesisEventRecord::default();
let _kinesis_record = KinesisRecord::default();
let _kinesis_encryption_type = KinesisEncryptionType::default();
}
}