traq_bot_http/payloads/
tag.rs

1//! タグ関連のイベントペイロード
2//! ## types
3//! - [`TagAddedPayload`](TagAddedPayload)
4//! - [`TagRemovedPayload`](TagRemovedPayload)
5
6use serde::{Deserialize, Serialize};
7
8use super::types::{TimeStamp, Uuid};
9
10/// `TAG_ADDED`ペイロード
11/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/service/bot/event/payload/ev_tag_added.go#L11-L16)
12/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/tag.md#tag_added)
13///
14/// ## Example
15/// ```
16/// # fn main() -> Result<(), serde_json::Error> {
17/// use traq_bot_http::payloads::TagAddedPayload;
18/// let payload = r##"{
19///     "eventTime": "2019-05-08T08:31:06.566228282Z",
20///     "tagId": "2bc06cda-bdb9-4a68-8000-62f907f36a92",
21///     "tag": "全強"
22/// }"##;
23/// let payload: TagAddedPayload = payload.parse()?;
24/// println!("{payload}");
25/// # Ok(())
26/// # }
27/// ```
28#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
29#[serde(rename_all = "camelCase")]
30pub struct TagAddedPayload {
31    #[serde(with = "crate::payloads::serde::timestamp")]
32    pub event_time: TimeStamp,
33    pub tag_id: Uuid,
34    pub tag: String,
35}
36
37impl From<TagRemovedPayload> for TagAddedPayload {
38    fn from(payload: TagRemovedPayload) -> Self {
39        let TagRemovedPayload {
40            event_time,
41            tag_id,
42            tag,
43        } = payload;
44        Self {
45            event_time,
46            tag_id,
47            tag,
48        }
49    }
50}
51
52/// `TAG_REMOVED`ペイロード
53/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/service/bot/event/payload/ev_tag_removed.go#L11-L16)
54/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/tag.md#tag_removed)
55///
56/// ## Example
57/// ```
58/// # fn main() -> Result<(), serde_json::Error> {
59/// use traq_bot_http::payloads::TagRemovedPayload;
60/// let payload = r##"{
61///     "eventTime": "2019-05-08T08:31:06.566228282Z",
62///     "tagId": "2bc06cda-bdb9-4a68-8000-62f907f36a92",
63///     "tag": "全強"
64/// }"##;
65/// let payload: TagRemovedPayload = payload.parse()?;
66/// println!("{payload}");
67/// # Ok(())
68/// # }
69/// ```
70#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
71#[serde(rename_all = "camelCase")]
72pub struct TagRemovedPayload {
73    #[serde(with = "crate::payloads::serde::timestamp")]
74    pub event_time: TimeStamp,
75    pub tag_id: Uuid,
76    pub tag: String,
77}
78
79impl From<TagAddedPayload> for TagRemovedPayload {
80    fn from(payload: TagAddedPayload) -> Self {
81        let TagAddedPayload {
82            event_time,
83            tag_id,
84            tag,
85        } = payload;
86        Self {
87            event_time,
88            tag_id,
89            tag,
90        }
91    }
92}
93
94#[cfg(test)]
95mod tests {
96    use super::*;
97    use crate::test_utils::{timestamp, uuid};
98
99    use std::fs::read_to_string;
100
101    #[test]
102    fn tag_added_test() {
103        let data = read_to_string("testdata/tag/tag_added.json").unwrap();
104        let payload: TagAddedPayload = data.parse().unwrap();
105        let pretty_payload = serde_json::to_string_pretty(&payload).unwrap();
106        println!("{pretty_payload}");
107        println!("{payload}");
108        assert_eq!(
109            payload,
110            TagAddedPayload {
111                event_time: timestamp("2019-05-08T08:31:06.566228282Z"),
112                tag_id: uuid("2bc06cda-bdb9-4a68-8000-62f907f36a92"),
113                tag: "全強".to_string(),
114            }
115        );
116    }
117
118    #[test]
119    fn tag_removed_test() {
120        let data = read_to_string("testdata/tag/tag_removed.json").unwrap();
121        let payload: TagRemovedPayload = data.parse().unwrap();
122        let pretty_payload = serde_json::to_string_pretty(&payload).unwrap();
123        println!("{pretty_payload}");
124        println!("{payload}");
125        assert_eq!(
126            payload,
127            TagRemovedPayload {
128                event_time: timestamp("2019-05-08T08:31:06.566228282Z"),
129                tag_id: uuid("2bc06cda-bdb9-4a68-8000-62f907f36a92"),
130                tag: "全強".to_string(),
131            }
132        );
133    }
134}