line_bot_messaging_api/entity/webhook/event/
message.rs

1use crate::util::LineUtil;
2use serde_derive::{Deserialize, Serialize};
3use serde_json::Value;
4
5#[derive(Debug, Default, Deserialize, Serialize, Clone)]
6#[serde(untagged)]
7pub enum LineWebhookEventMessage {
8    Text(LineWebhookEventMessageText),
9    Video(LineWebhookEventMessageVideo),
10    Image(LineWebhookEventMessageImage),
11    Audio(LineWebhookEventMessageAudio),
12    File(LineWebhookEventMessageFile),
13    Location(LineWebhookEventMessageLocation),
14    Sticker(LineWebhookEventMessageSticker),
15    #[default]
16    None,
17}
18
19
20impl LineWebhookEventMessage {
21    pub fn from_value(message: &Value) -> LineWebhookEventMessage {
22        let message_type = LineUtil::value_to_string("type", &message).unwrap_or_default();
23        match message_type.as_str() {
24            "text" => LineWebhookEventMessage::Text(
25                serde_json::from_value(message.clone()).unwrap_or_default(),
26            ),
27            "video" => LineWebhookEventMessage::Video(
28                serde_json::from_value(message.clone()).unwrap_or_default(),
29            ),
30            "image" => LineWebhookEventMessage::Image(
31                serde_json::from_value(message.clone()).unwrap_or_default(),
32            ),
33            "audio" => LineWebhookEventMessage::Audio(
34                serde_json::from_value(message.clone()).unwrap_or_default(),
35            ),
36            "file" => LineWebhookEventMessage::File(
37                serde_json::from_value(message.clone()).unwrap_or_default(),
38            ),
39            "location" => LineWebhookEventMessage::Location(
40                serde_json::from_value(message.clone()).unwrap_or_default(),
41            ),
42            "sticker" => LineWebhookEventMessage::Sticker(
43                serde_json::from_value(message.clone()).unwrap_or_default(),
44            ),
45            _ => LineWebhookEventMessage::None,
46        }
47    }
48    pub fn text(&self) -> &str {
49        match self {
50            LineWebhookEventMessage::Text(v) => v.text.as_str(),
51            LineWebhookEventMessage::Video(_) => "",
52            LineWebhookEventMessage::Image(_) => "",
53            LineWebhookEventMessage::Audio(_) => "",
54            LineWebhookEventMessage::File(_) => "",
55            LineWebhookEventMessage::Location(_) => "",
56            LineWebhookEventMessage::Sticker(_) => "",
57            LineWebhookEventMessage::None => "",
58        }
59    }
60}
61
62#[derive(Debug, Default, Deserialize, Serialize, Clone)]
63pub struct LineWebhookEventMessageText {
64    pub id: String,
65    #[serde(rename = "type")]
66    pub message_type: String,
67    #[serde(rename = "quoteToken")]
68    pub quote_token: String,
69    #[serde(rename = "text")]
70    pub text: String,
71    #[serde(rename = "emojis")]
72    pub emojis: Option<Vec<LineWebhookEventMessageTextEmoji>>,
73    #[serde(rename = "mention")]
74    pub mention: Option<LineWebhookEventMessageTextMention>,
75    #[serde(rename = "quotedMessageId")]
76    pub quoted_message_id: Option<String>,
77}
78
79#[derive(Debug, Default, Deserialize, Serialize, Clone)]
80pub struct LineWebhookEventMessageTextEmoji {
81    pub index: u32,
82    pub length: u32,
83    #[serde(rename = "productId")]
84    pub product_id: String,
85    #[serde(rename = "emojiId")]
86    pub emoji_id: String,
87    #[serde(rename = "quotedMessageId")]
88    pub quoted_message_id: Option<String>,
89}
90
91#[derive(Debug, Default, Deserialize, Serialize, Clone)]
92pub struct LineWebhookEventMessageTextMention {
93    pub mentionees: Vec<LineWebhookEventMessageTextMentionMentionees>,
94}
95
96#[derive(Debug, Default, Deserialize, Serialize, Clone)]
97pub struct LineWebhookEventMessageTextMentionMentionees {
98    pub index: u32,
99    pub length: u32,
100    #[serde(rename = "type")]
101    pub mention_type: String,
102    #[serde(rename = "userId")]
103    pub user_id: Option<String>,
104}
105
106#[derive(Debug, Default, Deserialize, Serialize, Clone)]
107pub struct LineWebhookEventMessageImage {
108    pub id: String,
109    #[serde(rename = "type")]
110    pub message_type: String,
111    #[serde(rename = "quoteToken")]
112    pub quote_token: String,
113    #[serde(rename = "contentProvider")]
114    pub content_provider: LineWebhookEventMessageContentProvider,
115    #[serde(rename = "imageSet")]
116    pub image_set: Option<LineWebhookEventMessageImageImageSet>,
117}
118
119#[derive(Debug, Default, Deserialize, Serialize, Clone)]
120pub struct LineWebhookEventMessageImageImageSet {
121    pub id: Option<String>,
122    pub index: Option<u32>,
123    pub total: Option<u32>,
124}
125
126#[derive(Debug, Default, Deserialize, Serialize, Clone)]
127pub struct LineWebhookEventMessageVideo {
128    pub id: String,
129    #[serde(rename = "type")]
130    pub message_type: String,
131    #[serde(rename = "quoteToken")]
132    pub quote_token: String,
133    #[serde(rename = "duration")]
134    pub duration: Option<u32>,
135    #[serde(rename = "contentProvider")]
136    pub content_provider: LineWebhookEventMessageContentProvider,
137}
138
139#[derive(Debug, Default, Deserialize, Serialize, Clone)]
140pub struct LineWebhookEventMessageAudio {
141    pub id: String,
142    #[serde(rename = "type")]
143    pub message_type: String,
144    #[serde(rename = "duration")]
145    pub duration: Option<u32>,
146    #[serde(rename = "contentProvider")]
147    pub content_provider: LineWebhookEventMessageContentProvider,
148}
149
150#[derive(Debug, Default, Deserialize, Serialize, Clone)]
151pub struct LineWebhookEventMessageFile {
152    pub id: String,
153    #[serde(rename = "type")]
154    pub message_type: String,
155    #[serde(rename = "fileName")]
156    pub file_name: String,
157    #[serde(rename = "fileSize")]
158    pub file_size: u32,
159}
160
161#[derive(Debug, Default, Deserialize, Serialize, Clone)]
162pub struct LineWebhookEventMessageLocation {
163    pub id: String,
164    #[serde(rename = "type")]
165    pub message_type: String,
166    pub title: Option<String>,
167    pub address: Option<String>,
168    pub latitude: f32,
169    pub longitude: f32,
170}
171
172#[derive(Debug, Default, Deserialize, Serialize, Clone)]
173pub struct LineWebhookEventMessageSticker {
174    pub id: String,
175    #[serde(rename = "type")]
176    pub message_type: String,
177    #[serde(rename = "quoteToken")]
178    pub quote_token: String,
179    #[serde(rename = "packageId")]
180    pub package_id: String,
181    #[serde(rename = "stickerId")]
182    pub sticker_id: String,
183    #[serde(rename = "stickerResourceType")]
184    pub sticker_resource_type: String,
185    pub keywords: Option<Vec<String>>,
186    pub text: Option<String>,
187    #[serde(rename = "quotedMessageId")]
188    pub quoted_message_id: Option<String>,
189}
190
191#[derive(Debug, Default, Deserialize, Serialize, Clone)]
192pub struct LineWebhookEventMessageContentProvider {
193    #[serde(rename = "type")]
194    pub content_provider_type: String,
195    #[serde(rename = "originalContentUrl")]
196    pub original_content_url: Option<String>,
197    #[serde(rename = "previewImageUrl")]
198    pub preview_image_url: Option<String>,
199}