aws_lambda_events/event/iot_1_click/
mod.rs

1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4use crate::custom_serde::deserialize_lambda_map;
5
6/// `IoTOneClickEvent` represents a click event published by clicking button type
7/// device.
8#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
9#[serde(rename_all = "camelCase")]
10pub struct IoTOneClickEvent {
11    pub device_event: IoTOneClickDeviceEvent,
12    pub device_info: IoTOneClickDeviceInfo,
13    pub placement_info: IoTOneClickPlacementInfo,
14}
15
16#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)]
17#[serde(rename_all = "camelCase")]
18pub struct IoTOneClickDeviceEvent {
19    pub button_clicked: IoTOneClickButtonClicked,
20}
21
22#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)]
23#[serde(rename_all = "camelCase")]
24pub struct IoTOneClickButtonClicked {
25    #[serde(default)]
26    pub click_type: Option<String>,
27    #[serde(default)]
28    pub reported_time: Option<String>,
29}
30
31#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
32#[serde(rename_all = "camelCase")]
33pub struct IoTOneClickDeviceInfo {
34    #[serde(deserialize_with = "deserialize_lambda_map")]
35    #[serde(default)]
36    pub attributes: HashMap<String, String>,
37    #[serde(default)]
38    pub type_: Option<String>,
39    #[serde(default)]
40    pub device_id: Option<String>,
41    pub remaining_life: f64,
42}
43
44#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)]
45#[serde(rename_all = "camelCase")]
46pub struct IoTOneClickPlacementInfo {
47    #[serde(default)]
48    pub project_name: Option<String>,
49    #[serde(default)]
50    pub placement_name: Option<String>,
51    #[serde(deserialize_with = "deserialize_lambda_map")]
52    #[serde(default)]
53    pub attributes: HashMap<String, String>,
54    #[serde(deserialize_with = "deserialize_lambda_map")]
55    #[serde(default)]
56    pub devices: HashMap<String, String>,
57}
58
59#[cfg(test)]
60mod test {
61    use super::*;
62
63    #[test]
64    #[cfg(feature = "iot_1_click")]
65    fn example_iot_1_click_event() {
66        let data = include_bytes!("../../fixtures/example-iot_1_click-event.json");
67        let parsed: IoTOneClickEvent = serde_json::from_slice(data).unwrap();
68        let output: String = serde_json::to_string(&parsed).unwrap();
69        let reparsed: IoTOneClickEvent = serde_json::from_slice(output.as_bytes()).unwrap();
70        assert_eq!(parsed, reparsed);
71    }
72}