1use crate::event::{meta::MetaEvent, notice::NoticeEvent, request::RequestEvent};
2use async_trait::async_trait;
3use message::MessageEvent;
5use serde::Deserialize;
6use tokio::sync::broadcast;
7pub mod message;
8pub mod meta;
9pub mod notice;
10pub mod request;
11
12#[derive(Deserialize, Debug, Clone)]
13#[serde(tag = "post_type")]
14pub enum Event {
15 #[serde(rename = "message")]
16 Message {
17 time: i64,
18 self_id: i64,
19 #[serde(flatten)]
20 data: Box<MessageEvent>,
21 },
22
23 #[serde(rename = "notice")]
24 Notice {
25 time: i64,
26 self_id: i64,
27 #[serde(flatten)]
28 data: NoticeEvent,
29 },
30
31 #[serde(rename = "request")]
32 Request {
33 time: i64,
34 self_id: i64,
35 #[serde(flatten)]
36 data: RequestEvent,
37 },
38
39 #[serde(rename = "meta_event")]
40 MetaEvent {
41 time: i64,
42 self_id: i64,
43 #[serde(flatten)]
44 data: MetaEvent,
45 },
46}
47
48pub trait EventTrait {}
59
60impl EventTrait for Event {}
61
62#[async_trait]
63pub trait EventReceiver<T: EventTrait> {
64 fn get_receiver(&self) -> broadcast::Receiver<T>;
68}