line_bot_messaging_api/entity/webhook/
mod.rs

1mod 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::*;
11// pub use source::*;
12
13pub 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}