traq_bot_http/payloads/
message.rs

1//! メッセージ関連のイベントペイロード
2//! ## types
3//! - [`MessageCreatedPayload`](MessageCreatedPayload)
4//! - [`MessageDeletedPayload`](MessageDeletedPayload)
5//! - [`MessageUpdatedPayload`](MessageUpdatedPayload)
6//! - [`DirectMessageCreatedPayload`](DirectMessageCreatedPayload)
7//! - [`DirectMessageDeletedPayload`](DirectMessageDeletedPayload)
8//! - [`DirectMessageUpdatedPayload`](DirectMessageUpdatedPayload)
9//! - [`BotMessageStampsUpdatedPayload`](BotMessageStampsUpdatedPayload)
10
11use serde::{Deserialize, Serialize};
12
13use super::types::{DeletedDirectMessage, DeletedMessage, Message, MessageStamp, TimeStamp, Uuid};
14
15/// `MESSAGE_CREATED`ペイロード
16/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/service/bot/event/payload/ev_message_created.go#L10-L14)
17/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/message.md#message_created)
18///
19/// ## Example
20/// ```
21/// # fn main() -> Result<(), serde_json::Error> {
22/// use traq_bot_http::payloads::MessageCreatedPayload;
23/// let payload = r##"{
24///     "eventTime": "2019-05-08T13:33:51.690308239Z",
25///     "message": {
26///         "id": "bc9106b3-f9b2-4eca-9ba1-72b39b40954e",
27///         "user": {
28///             "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45",
29///             "name": "takashi_trap",
30///             "displayName": "寺田 健二",
31///             "iconId": "2bc06cda-bdb9-4a68-8000-62f907f36a92",
32///             "bot": false
33///         },
34///         "channelId": "9aba50da-f605-4cd0-a428-5e4558cb911e",
35///         "text": "!{\"type\": \"user\", \"raw\": \"@takashi_trap\", \"id\": \"dfdff0c9-5de0-46ee-9721-2525e8bb3d45\"} こんにちは",
36///         "plainText": "@takashi_trap こんにちは",
37///         "embedded": [
38///             {
39///                 "raw": "@takashi_trap",
40///                 "type": "user",
41///                 "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45"
42///             }
43///         ],
44///         "createdAt": "2019-05-08T13:33:51.632149265Z",
45///         "updatedAt": "2019-05-08T13:33:51.632149265Z"
46///     }
47/// }"##;
48/// let payload: MessageCreatedPayload = payload.parse()?;
49/// println!("{payload}");
50/// # Ok(())
51/// # }
52/// ```
53#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
54#[serde(rename_all = "camelCase")]
55pub struct MessageCreatedPayload {
56    #[serde(with = "crate::payloads::serde::timestamp")]
57    pub event_time: TimeStamp,
58    pub message: Message,
59}
60
61impl From<DirectMessageCreatedPayload> for MessageCreatedPayload {
62    fn from(payload: DirectMessageCreatedPayload) -> Self {
63        let DirectMessageCreatedPayload {
64            event_time,
65            message,
66        } = payload;
67        Self {
68            event_time,
69            message,
70        }
71    }
72}
73
74/// `MESSAGE_DELETED`ペイロード
75/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/service/bot/event/payload/ev_message_deleted.go#L11-L18)
76/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/message.md#message_deleted)
77///
78/// ## Example
79/// ```
80/// # fn main() -> Result<(), serde_json::Error> {
81/// use traq_bot_http::payloads::MessageDeletedPayload;
82/// let payload = r##"{
83///     "eventTime": "2019-05-08T13:33:51.690308239Z",
84///     "message": {
85///         "id": "bc9106b3-f9b2-4eca-9ba1-72b39b40954e",
86///         "channelId": "9aba50da-f605-4cd0-a428-5e4558cb911e"
87///     }
88/// }"##;
89/// let payload = serde_json::from_str::<MessageDeletedPayload>(payload)?;
90/// println!("{payload}");
91/// # Ok(())
92/// # }
93/// ```
94#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
95#[serde(rename_all = "camelCase")]
96pub struct MessageDeletedPayload {
97    #[serde(with = "crate::payloads::serde::timestamp")]
98    pub event_time: TimeStamp,
99    pub message: DeletedMessage,
100}
101
102/// `MESSAGE_UPDATED`ペイロード
103/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/service/bot/event/payload/ev_direct_message_updated.go#L10-L14)
104/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/message.md#message_updated)
105///
106/// ## Example
107/// ```
108/// # fn main() -> Result<(), serde_json::Error> {
109/// use traq_bot_http::payloads::MessageUpdatedPayload;
110/// let payload = r##"{
111///     "eventTime": "2019-05-08T13:33:51.690308239Z",
112///     "message": {
113///         "id": "bc9106b3-f9b2-4eca-9ba1-72b39b40954e",
114///         "user": {
115///             "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45",
116///             "name": "takashi_trap",
117///             "displayName": "寺田 健二",
118///             "iconId": "2bc06cda-bdb9-4a68-8000-62f907f36a92",
119///             "bot": false
120///         },
121///         "channelId": "9aba50da-f605-4cd0-a428-5e4558cb911e",
122///         "text": "!{\"type\": \"user\", \"raw\": \"@takashi_trap\", \"id\": \"dfdff0c9-5de0-46ee-9721-2525e8bb3d45\"} こんにちは",
123///         "plainText": "@takashi_trap こんにちは",
124///         "embedded": [
125///             {
126///                 "raw": "@takashi_trap",
127///                 "type": "user",
128///                 "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45"
129///             }
130///         ],
131///         "createdAt": "2019-05-08T13:33:51.632149265Z",
132///         "updatedAt": "2019-05-08T13:33:51.632149265Z"
133///     }
134/// }"##;
135/// let payload = serde_json::from_str::<MessageUpdatedPayload>(payload)?;
136/// println!("{payload}");
137/// # Ok(())
138/// # }
139/// ```
140#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
141#[serde(rename_all = "camelCase")]
142pub struct MessageUpdatedPayload {
143    #[serde(with = "crate::payloads::serde::timestamp")]
144    pub event_time: TimeStamp,
145    pub message: Message,
146}
147
148impl From<DirectMessageUpdatedPayload> for MessageUpdatedPayload {
149    fn from(payload: DirectMessageUpdatedPayload) -> Self {
150        let DirectMessageUpdatedPayload {
151            event_time,
152            message,
153        } = payload;
154        Self {
155            event_time,
156            message,
157        }
158    }
159}
160
161/// `DIRECT_MESSAGE_CREATED`ペイロード
162/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/service/bot/event/payload/ev_direct_message_created.go#L10-L14)
163/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/message.md#direct_message_created)
164///
165/// ## Example
166/// ```
167/// # fn main() -> Result<(), serde_json::Error> {
168/// use traq_bot_http::payloads::DirectMessageCreatedPayload;
169/// let payload = r##"{
170///     "eventTime": "2019-05-08T13:36:09.421492525Z",
171///     "message": {
172///         "id": "2d7ff3f5-c313-4f4a-a9bb-0b5f84d2b6f8",
173///         "user": {
174///             "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45",
175///             "name": "takashi_trap",
176///             "displayName": "寺田 健二",
177///             "iconId": "2bc06cda-bdb9-4a68-8000-62f907f36a92",
178///             "bot": false
179///         },
180///         "channelId": "c5a5a697-3bad-4540-b2da-93dc88181d34",
181///         "text": "!{\"type\": \"user\", \"raw\": \"@takashi_trap\", \"id\": \"dfdff0c9-5de0-46ee-9721-2525e8bb3d45\"} こんにちは",
182///         "plainText": "@takashi_trap こんにちは",
183///         "embedded": [
184///             {
185///                 "raw": "@takashi_trap",
186///                 "type": "user",
187///                 "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45"
188///             }
189///         ],
190///         "createdAt": "2019-05-08T13:36:09.365393261Z",
191///         "updatedAt": "2019-05-08T13:36:09.365393261Z"
192///     }
193/// }"##;
194/// let payload = serde_json::from_str::<DirectMessageCreatedPayload>(payload)?;
195/// println!("{payload}");
196/// # Ok(())
197/// # }
198/// ```
199#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
200#[serde(rename_all = "camelCase")]
201pub struct DirectMessageCreatedPayload {
202    #[serde(with = "crate::payloads::serde::timestamp")]
203    pub event_time: TimeStamp,
204    pub message: Message,
205}
206
207impl From<MessageCreatedPayload> for DirectMessageCreatedPayload {
208    fn from(payload: MessageCreatedPayload) -> Self {
209        let MessageCreatedPayload {
210            event_time,
211            message,
212        } = payload;
213        Self {
214            event_time,
215            message,
216        }
217    }
218}
219
220/// `DIRECT_MESSAGE_DELETED`ペイロード
221/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/service/bot/event/payload/ev_direct_message_deleted.go#L11-L19)
222/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/message.md#direct_message_deleted)
223///
224/// ## Example
225/// ```
226/// # fn main() -> Result<(), serde_json::Error> {
227/// use traq_bot_http::payloads::DirectMessageDeletedPayload;
228/// let payload = r##"{
229///     "eventTime": "2019-05-08T13:36:09.421492525Z",
230///     "message": {
231///         "id": "2d7ff3f5-c313-4f4a-a9bb-0b5f84d2b6f8",
232///         "userId": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45",
233///         "channelId": "c5a5a697-3bad-4540-b2da-93dc88181d34"
234///     }
235/// }"##;
236/// let payload = serde_json::from_str::<DirectMessageDeletedPayload>(payload)?;
237/// println!("{payload}");
238/// # Ok(())
239/// # }
240/// ```
241#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
242#[serde(rename_all = "camelCase")]
243pub struct DirectMessageDeletedPayload {
244    #[serde(with = "crate::payloads::serde::timestamp")]
245    pub event_time: TimeStamp,
246    pub message: DeletedDirectMessage,
247}
248
249/// `DIRECT_MESSAGE_UPDATED`ペイロード
250/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/service/bot/event/payload/ev_direct_message_updated.go#L10-L14)
251/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/message.md#direct_message_updated)
252///
253/// ## Example
254/// ```
255/// # fn main() -> Result<(), serde_json::Error> {
256/// use traq_bot_http::payloads::DirectMessageUpdatedPayload;
257/// let payload = r##"{
258///     "eventTime": "2019-05-08T13:36:09.421492525Z",
259///     "message": {
260///         "id": "2d7ff3f5-c313-4f4a-a9bb-0b5f84d2b6f8",
261///         "user": {
262///             "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45",
263///             "name": "takashi_trap",
264///             "displayName": "寺田 健二",
265///             "iconId": "2bc06cda-bdb9-4a68-8000-62f907f36a92",
266///             "bot": false
267///         },
268///         "channelId": "c5a5a697-3bad-4540-b2da-93dc88181d34",
269///         "text": "!{\"type\": \"user\", \"raw\": \"@takashi_trap\", \"id\": \"dfdff0c9-5de0-46ee-9721-2525e8bb3d45\"} こんにちは",
270///         "plainText": "@takashi_trap こんにちは",
271///         "embedded": [
272///             {
273///                 "raw": "@takashi_trap",
274///                 "type": "user",
275///                 "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45"
276///             }
277///         ],
278///         "createdAt": "2019-05-08T13:36:09.365393261Z",
279///         "updatedAt": "2019-05-08T13:36:09.365393261Z"
280///     }
281/// }"##;
282/// let payload = serde_json::from_str::<DirectMessageUpdatedPayload>(payload)?;
283/// println!("{payload}");
284/// # Ok(())
285/// # }
286/// ```
287#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
288#[serde(rename_all = "camelCase")]
289pub struct DirectMessageUpdatedPayload {
290    #[serde(with = "crate::payloads::serde::timestamp")]
291    pub event_time: TimeStamp,
292    pub message: Message,
293}
294
295impl From<MessageUpdatedPayload> for DirectMessageUpdatedPayload {
296    fn from(payload: MessageUpdatedPayload) -> Self {
297        let MessageUpdatedPayload {
298            event_time,
299            message,
300        } = payload;
301        Self {
302            event_time,
303            message,
304        }
305    }
306}
307
308/// `BOT_MESSAGE_STAMPS_UPDATED`ペイロード
309/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/service/bot/event/payload/ev_bot_message_stamps_updated.go#L11-L16)
310/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/message.md#bot_message_stamps_updated)
311///
312/// ## Example
313/// ```
314/// # fn main() -> Result<(), serde_json::Error> {
315/// use traq_bot_http::payloads::BotMessageStampsUpdatedPayload;
316/// let payload = r##"{
317///     "eventTime": "2020-10-17T03:35:34.5326265Z",
318///     "messageId": "200b6600-b2cd-4c1e-b366-9c40308cc087",
319///     "stamps": [
320///         {
321///             "stampId": "1cd58034-8998-4b1c-afe4-fcd591354a97",
322///             "userId": "b80551a5-2768-4d29-ad78-8e0e92330c8d",
323///             "count": 22,
324///             "createdAt": "2020-10-17T03:35:17.89545Z",
325///             "updatedAt": "2020-10-17T03:35:34Z"
326///         },
327///         {
328///             "stampId": "6fc62b49-dea0-45b8-8c0c-38035082b111",
329///             "userId": "b80551a5-2768-4d29-ad78-8e0e92330c8d",
330///             "count": 23,
331///             "createdAt": "2020-10-17T03:35:17.737127Z",
332///             "updatedAt": "2020-10-17T03:35:34Z"
333///         },
334///         {
335///             "stampId": "b77fad4e-b63f-42a2-916c-5cfe5af3d8b9",
336///             "userId": "b80551a5-2768-4d29-ad78-8e0e92330c8d",
337///             "count": 24,
338///             "createdAt": "2020-10-17T03:34:56.575099Z",
339///             "updatedAt": "2020-10-17T03:35:34Z"
340///         }
341///     ]
342/// }"##;
343/// let payload = serde_json::from_str::<BotMessageStampsUpdatedPayload>(payload)?;
344/// println!("{payload}");
345/// # Ok(())
346/// # }
347/// ```
348#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
349#[serde(rename_all = "camelCase")]
350pub struct BotMessageStampsUpdatedPayload {
351    #[serde(with = "crate::payloads::serde::timestamp")]
352    pub event_time: TimeStamp,
353    pub message_id: Uuid,
354    pub stamps: Vec<MessageStamp>,
355}
356
357#[cfg(test)]
358mod tests {
359    use super::*;
360    use crate::test_utils::{embedded_takashi_trap, takashi_trap, timestamp, uuid};
361
362    use std::fs::read_to_string;
363
364    #[test]
365    fn message_created_test() {
366        let data = read_to_string("testdata/message/message_created.json").unwrap();
367        let payload: MessageCreatedPayload = data.parse().unwrap();
368        let pretty_payload = serde_json::to_string_pretty(&payload).unwrap();
369        println!("{pretty_payload}");
370        println!("{payload}");
371        assert_eq!(
372            payload,
373            MessageCreatedPayload {
374                event_time: timestamp("2019-05-08T13:33:51.690308239Z"),
375                message: Message {
376                    id: uuid("bc9106b3-f9b2-4eca-9ba1-72b39b40954e"),
377                    user: takashi_trap(),
378                    channel_id: uuid("9aba50da-f605-4cd0-a428-5e4558cb911e"),
379                    text: r#"!{"type": "user", "raw": "@takashi_trap", "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45"} こんにちは"#.to_string(),
380                    plain_text: "@takashi_trap こんにちは".to_string(),
381                    embedded: vec![
382                        embedded_takashi_trap(),
383                    ],
384                    created_at: timestamp("2019-05-08T13:33:51.632149265Z"),
385                    updated_at: timestamp("2019-05-08T13:33:51.632149265Z"),
386                },
387            }
388        );
389    }
390
391    #[test]
392    fn message_deleted_test() {
393        let data = read_to_string("testdata/message/message_deleted.json").unwrap();
394        let payload: MessageDeletedPayload = data.parse().unwrap();
395        let pretty_payload = serde_json::to_string_pretty(&payload).unwrap();
396        println!("{pretty_payload}");
397        println!("{payload}");
398        assert_eq!(
399            payload,
400            MessageDeletedPayload {
401                event_time: timestamp("2019-05-08T13:33:51.690308239Z"),
402                message: DeletedMessage {
403                    id: uuid("bc9106b3-f9b2-4eca-9ba1-72b39b40954e"),
404                    channel_id: uuid("9aba50da-f605-4cd0-a428-5e4558cb911e"),
405                },
406            }
407        );
408    }
409
410    #[test]
411    fn message_updated_test() {
412        let data = read_to_string("testdata/message/message_updated.json").unwrap();
413        let payload: MessageUpdatedPayload = data.parse().unwrap();
414        let pretty_payload = serde_json::to_string_pretty(&payload).unwrap();
415        println!("{pretty_payload}");
416        println!("{payload}");
417        assert_eq!(
418            payload,
419            MessageUpdatedPayload {
420                event_time: timestamp("2019-05-08T13:33:51.690308239Z"),
421                message: Message {
422                    id: uuid("bc9106b3-f9b2-4eca-9ba1-72b39b40954e"),
423                    user: takashi_trap(),
424                    channel_id: uuid("9aba50da-f605-4cd0-a428-5e4558cb911e"),
425                    text: r#"!{"type": "user", "raw": "@takashi_trap", "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45"} こんにちは"#.to_string(),
426                    plain_text: "@takashi_trap こんにちは".to_string(),
427                    embedded: vec![
428                        embedded_takashi_trap(),
429                    ],
430                    created_at: timestamp("2019-05-08T13:33:51.632149265Z"),
431                    updated_at: timestamp("2019-05-08T13:33:51.632149265Z"),
432                }
433            }
434        );
435    }
436
437    #[test]
438    fn direct_message_created_test() {
439        let data = read_to_string("testdata/message/direct_message_created.json").unwrap();
440        let payload: DirectMessageCreatedPayload = data.parse().unwrap();
441        let pretty_payload = serde_json::to_string_pretty(&payload).unwrap();
442        println!("{pretty_payload}");
443        println!("{payload}");
444        assert_eq!(
445            payload,
446            DirectMessageCreatedPayload {
447                event_time: timestamp("2019-05-08T13:36:09.421492525Z"),
448                message: Message {
449                    id: uuid("2d7ff3f5-c313-4f4a-a9bb-0b5f84d2b6f8"),
450                    user: takashi_trap(),
451                    channel_id: uuid("c5a5a697-3bad-4540-b2da-93dc88181d34"),
452                    text: r#"!{"type": "user", "raw": "@takashi_trap", "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45"} こんにちは"#.to_string(),
453                    plain_text: "@takashi_trap こんにちは".to_string(),
454                    embedded: vec![
455                        embedded_takashi_trap(),
456                    ],
457                    created_at: timestamp("2019-05-08T13:36:09.365393261Z"),
458                    updated_at: timestamp("2019-05-08T13:36:09.365393261Z"),
459                },
460            }
461        );
462    }
463
464    #[test]
465    fn direct_message_deleted_test() {
466        let data = read_to_string("testdata/message/direct_message_deleted.json").unwrap();
467        let payload: DirectMessageDeletedPayload = data.parse().unwrap();
468        let pretty_payload = serde_json::to_string_pretty(&payload).unwrap();
469        println!("{pretty_payload}");
470        println!("{payload}");
471        assert_eq!(
472            payload,
473            DirectMessageDeletedPayload {
474                event_time: timestamp("2019-05-08T13:36:09.421492525Z"),
475                message: DeletedDirectMessage {
476                    id: uuid("2d7ff3f5-c313-4f4a-a9bb-0b5f84d2b6f8"),
477                    user_id: uuid("dfdff0c9-5de0-46ee-9721-2525e8bb3d45"),
478                    channel_id: uuid("c5a5a697-3bad-4540-b2da-93dc88181d34"),
479                }
480            }
481        );
482    }
483
484    #[test]
485    fn direct_message_updated_test() {
486        let data = read_to_string("testdata/message/direct_message_updated.json").unwrap();
487        let payload: DirectMessageUpdatedPayload = data.parse().unwrap();
488        let pretty_payload = serde_json::to_string_pretty(&payload).unwrap();
489        println!("{pretty_payload}");
490        println!("{payload}");
491        assert_eq!(
492            payload,
493            DirectMessageUpdatedPayload {
494                event_time: timestamp("2019-05-08T13:36:09.421492525Z"),
495                message: Message {
496                    id: uuid("2d7ff3f5-c313-4f4a-a9bb-0b5f84d2b6f8"),
497                    user: takashi_trap(),
498                    channel_id: uuid("c5a5a697-3bad-4540-b2da-93dc88181d34"),
499                    text: r#"!{"type": "user", "raw": "@takashi_trap", "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45"} こんにちは"#.to_string(),
500                    plain_text: "@takashi_trap こんにちは".to_string(),
501                    embedded: vec![
502                        embedded_takashi_trap(),
503                    ],
504                    created_at: timestamp("2019-05-08T13:36:09.365393261Z"),
505                    updated_at: timestamp("2019-05-08T13:36:09.365393261Z"),
506                },
507            }
508        );
509    }
510
511    #[test]
512    fn bot_message_stamps_updated_test() {
513        let data = read_to_string("testdata/message/bot_message_stamps_updated.json").unwrap();
514        let payload: BotMessageStampsUpdatedPayload = data.parse().unwrap();
515        let pretty_payload = serde_json::to_string_pretty(&payload).unwrap();
516        println!("{pretty_payload}");
517        println!("{payload}");
518        assert_eq!(
519            payload,
520            BotMessageStampsUpdatedPayload {
521                event_time: timestamp("2020-10-17T03:35:34.5326265Z"),
522                message_id: uuid("200b6600-b2cd-4c1e-b366-9c40308cc087"),
523                stamps: vec![
524                    MessageStamp {
525                        stamp_id: uuid("1cd58034-8998-4b1c-afe4-fcd591354a97"),
526                        user_id: uuid("b80551a5-2768-4d29-ad78-8e0e92330c8d"),
527                        count: 22,
528                        created_at: timestamp("2020-10-17T03:35:17.89545Z"),
529                        updated_at: timestamp("2020-10-17T03:35:34Z"),
530                    },
531                    MessageStamp {
532                        stamp_id: uuid("6fc62b49-dea0-45b8-8c0c-38035082b111"),
533                        user_id: uuid("b80551a5-2768-4d29-ad78-8e0e92330c8d"),
534                        count: 23,
535                        created_at: timestamp("2020-10-17T03:35:17.737127Z"),
536                        updated_at: timestamp("2020-10-17T03:35:34Z"),
537                    },
538                    MessageStamp {
539                        stamp_id: uuid("b77fad4e-b63f-42a2-916c-5cfe5af3d8b9"),
540                        user_id: uuid("b80551a5-2768-4d29-ad78-8e0e92330c8d"),
541                        count: 24,
542                        created_at: timestamp("2020-10-17T03:34:56.575099Z"),
543                        updated_at: timestamp("2020-10-17T03:35:34Z"),
544                    },
545                ],
546            }
547        );
548    }
549}