|
| 1 | +// Copyright 2024-2026 - Andriel Ferreira |
| 2 | +// |
| 3 | +// Licensed under the MIT license <LICENSE or https://opensource.org/licenses/MIT>. |
| 4 | +// This file may not be copied, modified, or distributed except according to those terms. |
1 | 5 |
|
| 6 | +//! General helper macros exports. |
| 7 | +
|
| 8 | +mod handler; |
| 9 | + |
| 10 | +use proc_macro::TokenStream; |
| 11 | +use syn::{Expr, ItemFn}; |
| 12 | + |
| 13 | +use crate::handler::{UpdateType, new_handler}; |
| 14 | + |
| 15 | +/// Build a new `NewMessage` handler. |
| 16 | +/// |
| 17 | +/// Note: `always` is the default filter; it will be used if no filter is specified. |
| 18 | +/// |
| 19 | +/// # Examples |
| 20 | +/// |
| 21 | +/// ```ignore |
| 22 | +/// use ferogram::prelude::*; |
| 23 | +/// #[handler::new_message(command("/start :id?"))] |
| 24 | +/// async fn start(message: Message) -> Result<()> { |
| 25 | +/// Ok(()) |
| 26 | +/// } |
| 27 | +/// ``` |
| 28 | +#[proc_macro_attribute] |
| 29 | +pub fn new_message(attr: TokenStream, input: TokenStream) -> TokenStream { |
| 30 | + let filters = syn::parse::<Expr>(attr).ok(); |
| 31 | + let input = syn::parse_macro_input!(input as ItemFn); |
| 32 | + |
| 33 | + new_handler(UpdateType::NewMessage, filters, input) |
| 34 | +} |
| 35 | + |
| 36 | +/// Build a new `MessageEdited` handler. |
| 37 | +/// |
| 38 | +/// Note: `always` is the default filter; it will be used if no filter is specified. |
| 39 | +/// |
| 40 | +/// # Examples |
| 41 | +/// |
| 42 | +/// ```ignore |
| 43 | +/// use ferogram::prelude::*; |
| 44 | +/// #[handler::message_edited(command("/start :id?"))] |
| 45 | +/// async fn start(message: Message) -> Result<()> { |
| 46 | +/// Ok(()) |
| 47 | +/// } |
| 48 | +/// ``` |
| 49 | +#[proc_macro_attribute] |
| 50 | +pub fn message_edited(attr: TokenStream, input: TokenStream) -> TokenStream { |
| 51 | + let filters = syn::parse::<Expr>(attr).ok(); |
| 52 | + let input = syn::parse_macro_input!(input as ItemFn); |
| 53 | + |
| 54 | + new_handler(UpdateType::MessageEdited, filters, input) |
| 55 | +} |
| 56 | + |
| 57 | +/// Build a new `MessageDeleted` handler. |
| 58 | +/// |
| 59 | +/// Note: `always` is the default filter; it will be used if no filter is specified. |
| 60 | +/// |
| 61 | +/// # Examples |
| 62 | +/// |
| 63 | +/// ```ignore |
| 64 | +/// use ferogram::prelude::*; |
| 65 | +/// #[handler::message_deleted] |
| 66 | +/// async fn start(message: Message) -> Result<()> { |
| 67 | +/// Ok(()) |
| 68 | +/// } |
| 69 | +/// ``` |
| 70 | +#[proc_macro_attribute] |
| 71 | +pub fn message_deleted(attr: TokenStream, input: TokenStream) -> TokenStream { |
| 72 | + let filters = syn::parse::<Expr>(attr).ok(); |
| 73 | + let input = syn::parse_macro_input!(input as ItemFn); |
| 74 | + |
| 75 | + new_handler(UpdateType::MessageDeleted, filters, input) |
| 76 | +} |
| 77 | + |
| 78 | +/// Build a new `CallbackQuery` handler. |
| 79 | +/// |
| 80 | +/// Note: `always` is the default filter; it will be used if no filter is specified. |
| 81 | +/// |
| 82 | +/// # Examples |
| 83 | +/// |
| 84 | +/// ```ignore |
| 85 | +/// use ferogram::prelude::*; |
| 86 | +/// #[handler::callback_query(command("start :id?"))] |
| 87 | +/// async fn start(query: CallbackQuery) -> Result<()> { |
| 88 | +/// Ok(()) |
| 89 | +/// } |
| 90 | +/// ``` |
| 91 | +#[proc_macro_attribute] |
| 92 | +pub fn callback_query(attr: TokenStream, input: TokenStream) -> TokenStream { |
| 93 | + let filters = syn::parse::<Expr>(attr).ok(); |
| 94 | + let input = syn::parse_macro_input!(input as ItemFn); |
| 95 | + |
| 96 | + new_handler(UpdateType::CallbackQuery, filters, input) |
| 97 | +} |
| 98 | + |
| 99 | +/// Build a new `InlineQuery` handler. |
| 100 | +/// |
| 101 | +/// Note: `always` is the default filter; it will be used if no filter is specified. |
| 102 | +/// |
| 103 | +/// # Examples |
| 104 | +/// |
| 105 | +/// ```ignore |
| 106 | +/// use ferogram::prelude::*; |
| 107 | +/// #[handler::inline_query(command("images *query?"))] |
| 108 | +/// async fn start(query: InlineQuery) -> Result<()> { |
| 109 | +/// Ok(()) |
| 110 | +/// } |
| 111 | +/// ``` |
| 112 | +#[proc_macro_attribute] |
| 113 | +pub fn inline_query(attr: TokenStream, input: TokenStream) -> TokenStream { |
| 114 | + let filters = syn::parse::<Expr>(attr).ok(); |
| 115 | + let input = syn::parse_macro_input!(input as ItemFn); |
| 116 | + |
| 117 | + new_handler(UpdateType::InlineQuery, filters, input) |
| 118 | +} |
| 119 | + |
| 120 | +/// Build a new `InlineSend` handler. |
| 121 | +/// |
| 122 | +/// Note: `always` is the default filter; it will be used if no filter is specified. |
| 123 | +/// |
| 124 | +/// # Examples |
| 125 | +/// |
| 126 | +/// ```ignore |
| 127 | +/// use ferogram::prelude::*; |
| 128 | +/// #[handler::inline_send(command("images *query?"))] |
| 129 | +/// async fn start(query: InlineQuery) -> Result<()> { |
| 130 | +/// Ok(()) |
| 131 | +/// } |
| 132 | +/// ``` |
| 133 | +#[proc_macro_attribute] |
| 134 | +pub fn inline_send(attr: TokenStream, input: TokenStream) -> TokenStream { |
| 135 | + let filters = syn::parse::<Expr>(attr).ok(); |
| 136 | + let input = syn::parse_macro_input!(input as ItemFn); |
| 137 | + |
| 138 | + new_handler(UpdateType::InlineSend, filters, input) |
| 139 | +} |
0 commit comments