1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
//! タグ関連のイベントペイロード
//! ## types
//! - [`TagAddedPayload`](TagAddedPayload)
//! - [`TagRemovedPayload`](TagRemovedPayload)

use serde::{Deserialize, Serialize};

use super::types::{TimeStamp, Uuid};
use crate::macros::payload_impl;

/// TAG_ADDEDペイロード
/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/service/bot/event/payload/ev_tag_added.go#L11-L16)
/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/tag.md#tag_added)
///
/// ## Example
/// ```
/// use traq_bot_http::payloads::TagAddedPayload;
/// let payload = r##"{
///     "eventTime": "2019-05-08T08:31:06.566228282Z",
///     "tagId": "2bc06cda-bdb9-4a68-8000-62f907f36a92",
///     "tag": "全強"
/// }"##;
/// let payload: TagAddedPayload = payload.parse().unwrap();
/// println!("{payload}");
/// ```
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct TagAddedPayload {
    #[serde(rename = "eventTime", with = "crate::payloads::serde::timestamp")]
    pub event_time: TimeStamp,
    #[serde(rename = "tagId")]
    pub tag_id: Uuid,
    pub tag: String,
}

payload_impl! {TagAddedPayload}

impl From<TagRemovedPayload> for TagAddedPayload {
    fn from(payload: TagRemovedPayload) -> Self {
        let TagRemovedPayload {
            event_time,
            tag_id,
            tag,
        } = payload;
        Self {
            event_time,
            tag_id,
            tag,
        }
    }
}

/// TAG_REMOVEDペイロード
/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/service/bot/event/payload/ev_tag_removed.go#L11-L16)
/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/tag.md#tag_removed)
///
/// ## Example
/// ```
/// use traq_bot_http::payloads::TagRemovedPayload;
/// let payload = r##"{
///     "eventTime": "2019-05-08T08:31:06.566228282Z",
///     "tagId": "2bc06cda-bdb9-4a68-8000-62f907f36a92",
///     "tag": "全強"
/// }"##;
/// let payload: TagRemovedPayload = payload.parse().unwrap();
/// println!("{payload}");
/// ```
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct TagRemovedPayload {
    #[serde(rename = "eventTime", with = "crate::payloads::serde::timestamp")]
    pub event_time: TimeStamp,
    #[serde(rename = "tagId")]
    pub tag_id: Uuid,
    pub tag: String,
}

payload_impl! {TagRemovedPayload}

impl From<TagAddedPayload> for TagRemovedPayload {
    fn from(payload: TagAddedPayload) -> Self {
        let TagAddedPayload {
            event_time,
            tag_id,
            tag,
        } = payload;
        Self {
            event_time,
            tag_id,
            tag,
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::test_utils::*;

    use std::fs::read_to_string;

    #[test]
    fn tag_added_test() {
        let data = read_to_string("testdata/tag/tag_added.json").unwrap();
        let payload: TagAddedPayload = data.parse().unwrap();
        println!("{}", serde_json::to_string_pretty(&payload).unwrap());
        println!("{}", payload);
        assert_eq!(
            payload,
            TagAddedPayload {
                event_time: timestamp("2019-05-08T08:31:06.566228282Z"),
                tag_id: uuid("2bc06cda-bdb9-4a68-8000-62f907f36a92"),
                tag: "全強".to_string(),
            }
        );
    }

    #[test]
    fn tag_removed_test() {
        let data = read_to_string("testdata/tag/tag_removed.json").unwrap();
        let payload: TagRemovedPayload = data.parse().unwrap();
        println!("{}", serde_json::to_string_pretty(&payload).unwrap());
        println!("{}", payload);
        assert_eq!(
            payload,
            TagRemovedPayload {
                event_time: timestamp("2019-05-08T08:31:06.566228282Z"),
                tag_id: uuid("2bc06cda-bdb9-4a68-8000-62f907f36a92"),
                tag: "全強".to_string(),
            }
        );
    }
}