lambda_sqs/
domain.rs

1use serde::{de::DeserializeOwned, Deserialize, Serialize};
2use std::fmt;
3
4#[derive(Deserialize, Serialize, Eq, PartialEq, Ord, PartialOrd, Hash, Default, Clone, Debug)]
5pub struct SqsMessage {
6    body: Option<String>,
7}
8
9impl SqsMessage {
10    #[allow(dead_code)]
11    fn new() -> Self {
12        Self::default()
13    }
14
15    fn as_string(&self) -> String {
16        self.body.clone().unwrap_or_default()
17    }
18}
19
20impl fmt::Display for SqsMessage {
21    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
22        match self.body.clone() {
23            Some(s) => write!(f, "{}", &s),
24            None => write!(f, ""),
25        }
26    }
27}
28
29/// Type that accepts a batch of messages from SQS
30#[derive(Deserialize, Serialize, Eq, PartialEq, Ord, PartialOrd, Hash, Default, Clone, Debug)]
31pub struct SqsEvent {
32    #[serde(rename = "Records")]
33    records: Vec<SqsMessage>,
34}
35
36impl SqsEvent {
37    /// Convert the batch of SQS Message bodies into your Type
38    /// Your type must implement [DeserializeOwned] and [Default]
39    ///
40    /// # Example
41    /// ``` no_run
42    /// # type MyType = Vec<String>;
43    /// # use lambda_sqs::{SqsEvent, Context};
44    /// #
45    /// # fn handler(sqs_events:SqsEvent, c: Context) {
46    /// let my_events: MyType = sqs_events.into_t();
47    /// # }
48    /// ```
49    pub fn into_t<T>(self) -> Vec<T>
50    where
51        T: DeserializeOwned + Default,
52    {
53        self.records
54            .into_iter()
55            .map(move |message| serde_json::from_str(&message.as_string()).unwrap_or_default())
56            .collect()
57    }
58}
59
60impl fmt::Display for SqsEvent {
61    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
62        writeln!(f, "[")?;
63        self.records
64            .clone()
65            .into_iter()
66            .try_for_each(|item| writeln!(f, "{}", item))?;
67        writeln!(f, "]")
68    }
69}