line_bot_messaging_api/entity/webhook/event/
message.rs1use 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}