1use async_trait::async_trait;
2use grammers_client::types::{CallbackQuery, InlineQuery, Message, MessageDeletion};
3use grammers_client::Update;
4use grammers_tl_types as tl;
5
6macro_rules! process_trait {
7 ($name:ident, $event:path) => {
8 #[async_trait]
9 pub trait $name: Sync + Send {
10 async fn handle(
11 &self,
12 client: &mut grammers_client::Client,
13 event: &$event,
14 ) -> anyhow::Result<bool>;
15 }
16 };
17}
18
19process_trait!(UpdateProcess, Update);
20process_trait!(NewMessageProcess, Message);
21process_trait!(MessageEditedProcess, Message);
22process_trait!(MessageDeletedProcess, MessageDeletion);
23process_trait!(CallbackQueryProcess, CallbackQuery);
24process_trait!(InlineQueryProcess, InlineQuery);
25process_trait!(RawProcess, tl::enums::Update);
26
27pub enum Process {
28 UpdateProcess(Box<dyn UpdateProcess>),
29 NewMessageProcess(Box<dyn NewMessageProcess>),
30 MessageEditedProcess(Box<dyn MessageEditedProcess>),
31 MessageDeletedProcess(Box<dyn MessageDeletedProcess>),
32 CallbackQueryProcess(Box<dyn CallbackQueryProcess>),
33 InlineQueryProcess(Box<dyn InlineQueryProcess>),
34 RawProcess(Box<dyn RawProcess>),
35}
36
37pub struct Module {
38 pub id: String,
39 pub name: String,
40 pub handlers: Vec<Handler>,
41}
42
43pub struct Handler {
44 pub id: String,
45 pub process: Process,
46}