line_bot_messaging_api/entity/webhook/
mod.rs1mod event;
2pub mod source;
3
4use crate::webhook::source::{LineWebhookSource, LineWebhookSourceUser};
5use serde_derive::{Deserialize, Serialize};
6use serde_json::Value;
7
8use crate::util::LineUtil;
9use crate::webhook::message::LineWebhookEventMessage;
10pub use event::*;
11pub struct LineWebhook {}
14
15impl LineWebhook {
16 pub fn parse_str(input: &str) -> LineWebhookResponse {
17 let input: Value = match serde_json::from_str(input) {
18 Ok(input) => input,
19 Err(e) => {
20 println!("parse_str: {}", e);
21 return LineWebhookResponse {
22 destination: "".to_string(),
23 events: vec![],
24 };
25 }
26 };
27 let destination = LineUtil::value_to_string("destination", &input).unwrap_or_default();
28 let events = LineUtil::value_to_array("events", &input).unwrap_or_default();
29
30 let events = events
31 .into_iter()
32 .map(|value| match serde_json::from_value(value.clone()) {
33 Ok(event) => {
34 let mut event: LineWebhookEvent = event;
35 event.json = value.to_string();
36
37 let event_type = event.webhook_type.to_string();
38
39 event.object = match event_type.as_str() {
40 "message" => {
41 let message =
42 LineUtil::value_to_value("message", &value).unwrap_or_default();
43
44 LineWebhookEventObject::Message(LineWebhookEventMessage::from_value(
45 &message,
46 ))
47 }
48 "unsend" => LineWebhookEventObject::UnSend(
49 serde_json::from_value(
50 LineUtil::value_to_value("unsend", &value).unwrap_or_default(),
51 )
52 .unwrap_or_default(),
53 ),
54 "follow" => LineWebhookEventObject::Follow,
55 "unfollow" => LineWebhookEventObject::UnFollow,
56 "join" => LineWebhookEventObject::Join,
57 "leave" => LineWebhookEventObject::Leave,
58 "memberJoined" => LineWebhookEventObject::MemberJoined(
59 serde_json::from_value(
60 LineUtil::value_to_value("joined", &value).unwrap_or_default(),
61 )
62 .unwrap_or_default(),
63 ),
64 "memberLeft" => LineWebhookEventObject::MemberLeft(
65 serde_json::from_value(
66 LineUtil::value_to_value("left", &value).unwrap_or_default(),
67 )
68 .unwrap_or_default(),
69 ),
70 "postback" => LineWebhookEventObject::Postback(
71 serde_json::from_value(
72 LineUtil::value_to_value("postback", &value).unwrap_or_default(),
73 )
74 .unwrap_or_default(),
75 ),
76 "videoPlayComplete" => LineWebhookEventObject::VideoPlayComplete(
77 serde_json::from_value(
78 LineUtil::value_to_value("videoPlayComplete", &value)
79 .unwrap_or_default(),
80 )
81 .unwrap_or_default(),
82 ),
83 "beacon" => LineWebhookEventObject::Beacon(
84 serde_json::from_value(
85 LineUtil::value_to_value("beacon", &value).unwrap_or_default(),
86 )
87 .unwrap_or_default(),
88 ),
89 "accountLink" => LineWebhookEventObject::AccountLink(
90 serde_json::from_value(
91 LineUtil::value_to_value("link", &value).unwrap_or_default(),
92 )
93 .unwrap_or_default(),
94 ),
95 "things" => LineWebhookEventObject::Things(
96 serde_json::from_value(
97 LineUtil::value_to_value("things", &value).unwrap_or_default(),
98 )
99 .unwrap_or_default(),
100 ),
101 _ => LineWebhookEventObject::None,
102 };
103 event
104 }
105 Err(e) => {
106 println!("parse_str: {}", e);
107 LineWebhookEvent {
108 webhook_type: "".to_string(),
109 mode: "".to_string(),
110 timestamp: 0,
111 source: LineWebhookSource::User(LineWebhookSourceUser {
112 source_type: "".to_string(),
113 user_id: "".to_string(),
114 }),
115 webhook_event_id: "".to_string(),
116 delivery_context: LineDeliveryContext::default(),
117 reply_token: None,
118 object: LineWebhookEventObject::None,
119 json: "".to_string(),
120 }
121 }
122 })
123 .collect();
124
125 LineWebhookResponse {
126 destination,
127 events,
128 }
129 }
130}
131
132#[derive(Debug, Deserialize, Serialize, Clone)]
133pub struct LineWebhookResponse {
134 destination: String,
135 events: Vec<LineWebhookEvent>,
136}
137
138impl LineWebhookResponse {
139 pub fn events(&self) -> Vec<LineWebhookEvent> {
140 self.events.clone()
141 }
142}
143
144#[derive(Debug, Deserialize, Serialize, Clone)]
145pub struct LineWebhookEvent {
146 #[serde(rename = "type")]
147 webhook_type: String,
148 mode: String,
149 timestamp: u64,
150 source: LineWebhookSource,
151 #[serde(rename = "webhookEventId")]
152 webhook_event_id: String,
153 #[serde(rename = "deliveryContext")]
154 delivery_context: LineDeliveryContext,
155 #[serde(rename = "replyToken")]
156 reply_token: Option<String>,
157 #[serde(skip)]
158 object: LineWebhookEventObject,
159 #[serde(skip)]
160 json: String,
161}
162
163impl LineWebhookEvent {
164 pub fn webhook_type(&self) -> &str {
165 self.webhook_type.as_str()
166 }
167 pub fn mode(&self) -> &str {
168 self.mode.as_str()
169 }
170 pub fn timestamp(&self) -> u64 {
171 self.timestamp
172 }
173 pub fn source(&self) -> &LineWebhookSource {
174 &self.source
175 }
176 pub fn webhook_event_id(&self) -> &str {
177 self.webhook_event_id.as_str()
178 }
179 pub fn delivery_context(&self) -> &LineDeliveryContext {
180 &self.delivery_context
181 }
182 pub fn data(&self) -> &LineWebhookEventObject {
183 &self.object
184 }
185 pub fn json(&self) -> &str {
186 self.json.as_str()
187 }
188 pub fn reply_token(&self) -> Option<&str> {
189 match &self.reply_token {
190 Some(reply_token) => Some(reply_token.as_str()),
191 None => None,
192 }
193 }
194}
195
196#[derive(Debug, Default, Deserialize, Serialize, Clone)]
197pub struct LineDeliveryContext {
198 #[serde(rename = "isRedelivery")]
199 is_redelivery: bool,
200}