telegram_bot/
macros.rs

1/// Create a reply markup.
2///
3/// # Examples
4/// ```
5/// # #[macro_use] extern crate telegram_bot;
6/// # fn main() {
7/// let reply_keyboard = reply_markup!(reply_keyboard, selective, one_time, resize,
8///     ["button", "button"],
9///     ["button" contact], // Request contact
10///     ["button" location] // Request location
11/// );
12///
13/// let remove_keyboard = reply_markup!(remove_keyboard);
14/// let selective_remove_keyboard = reply_markup!(remove_keyboard, selective);
15///
16/// let force_reply = reply_markup!(force_reply);
17/// let selective_force_reply = reply_markup!(force_reply, selective);
18///
19/// let inline_keyboard = reply_markup!(inline_keyboard,
20///     ["button" callback "0,0", "button" callback "0,1"],
21///     ["button" callback "1,0", "button" callback "1,1", "button" callback "1,2"]
22/// );
23///
24/// # drop(inline_keyboard);
25/// # drop(selective_force_reply);
26/// # drop(force_reply);
27/// # drop(selective_remove_keyboard);
28/// # drop(remove_keyboard);
29/// # drop(reply_keyboard);
30/// # }
31/// ```
32#[macro_export]
33macro_rules! reply_markup {
34    (remove_keyboard) => ({
35          $crate::ReplyKeyboardRemove::new()
36    });
37
38    (remove_keyboard, selective) => ({
39          let mut keyboard = reply_markup!(remove_keyboard);
40          keyboard.selective();
41          keyboard
42    });
43
44    (force_reply) => ({
45          $crate::ForceReply::new()
46    });
47
48    (force_reply, selective) => ({
49          let mut keyboard = reply_markup!(force_reply);
50          keyboard.selective();
51          keyboard
52    });
53
54    (reply_keyboard, $($content:tt)*) => ({
55        reply_markup!(_reply_keyboard, $($content)*)
56    });
57
58    (_reply_keyboard, resize, $($content:tt)*) => ({
59        let mut keyboard = reply_markup!(_reply_keyboard, $($content)*);
60        keyboard.resize_keyboard();
61        keyboard
62    });
63
64    (_reply_keyboard, one_time, $($content:tt)*) => ({
65        let mut keyboard = reply_markup!(_reply_keyboard, $($content)*);
66        keyboard.one_time_keyboard();
67        keyboard
68    });
69
70    (_reply_keyboard, selective, $($content:tt)*) => ({
71        let mut keyboard = reply_markup!(_reply_keyboard, $($content)*);
72        keyboard.selective();
73        keyboard
74    });
75
76    (_reply_keyboard, $([$($content:tt)*]), *) => (
77        $crate::ReplyKeyboardMarkup::from(vec![$(reply_markup![_reply_keyboard_row, $($content)*]), *])
78    );
79
80    (_reply_keyboard_row, ($($acc:tt)*); $value:expr) => (vec![$($acc)* reply_markup!(_reply_keyboard_button, $value)]);
81    (_reply_keyboard_row, ($($acc:tt)*); $value:expr, $($remaining:tt)*) => (
82    reply_markup!(_reply_keyboard_row, ($($acc)* reply_markup!(_reply_keyboard_button,  $value),); $($remaining)*)
83
84    );
85
86    (_reply_keyboard_row, ($($acc:tt)*); $value:tt $request:tt) => (vec![$($acc)* reply_markup!(_reply_keyboard_button,  $value, $request)]);
87    (_reply_keyboard_row, ($($acc:tt)*); $value:tt $request:tt, $($remaining: tt)*) => (
88        reply_markup!(_reply_keyboard_row, ($($acc)* reply_markup!(_reply_keyboard_button, $value, $request),); $($remaining)*)
89    );
90
91    (_reply_keyboard_row, $($content:expr), *) => (vec![$(reply_markup!(_reply_keyboard_button,  $content)), *]);
92    (_reply_keyboard_row, $($content:tt)*) => (reply_markup!(_reply_keyboard_row, (); $($content)*));
93
94    (_reply_keyboard_button, $value:expr, contact) => ({
95        let mut button: $crate::KeyboardButton = reply_markup!(_reply_keyboard_button, $value);
96        button.request_contact();
97        button
98    });
99
100    (_reply_keyboard_button, $value:expr, location) => ({
101        let mut button: $crate::KeyboardButton = reply_markup!(_reply_keyboard_button, $value);
102        button.request_location();
103        button
104    });
105    (_reply_keyboard_button, $value:expr) => ($value.into());
106
107    (inline_keyboard, $([$($content:tt)*]), *) => (
108        $crate::InlineKeyboardMarkup::from(vec![$(reply_markup![_inline_keyboard_row, $($content)*]), *])
109    );
110
111    (_inline_keyboard_row, ($($acc:tt)*); $text:tt $request:tt $callback:tt) => (
112        vec![$($acc)* reply_markup!(_inline_keyboard_button, $request,  $text, $callback)]
113    );
114    (_inline_keyboard_row, $($text:tt $request:tt $callback:tt), *) => (
115        vec![$(reply_markup!(_inline_keyboard_button, $request, $text, $callback)), *]
116    );
117    (_inline_keyboard_row, $($content:tt)*) => (reply_markup!(_inline_keyboard_row, (); $($content)*));
118
119    (_inline_keyboard_button, callback, $text:expr, $callback:expr) => (
120        $crate::InlineKeyboardButton::callback($text, $callback)
121    );
122    (_inline_keyboard_button, url, $text:expr, $url:expr) => (
123        $crate::InlineKeyboardButton::url($text, $url)
124    );
125}
126
127#[cfg(test)]
128mod tests {
129    use telegram_bot_raw::*;
130
131    #[test]
132    fn test_simple() {
133        let mut remove_keyboard = ReplyKeyboardRemove::new();
134        assert_eq!(remove_keyboard, reply_markup!(remove_keyboard));
135
136        remove_keyboard.selective();
137        assert_eq!(remove_keyboard, reply_markup!(remove_keyboard, selective));
138
139        let mut force_reply = ForceReply::new();
140        assert_eq!(force_reply, reply_markup!(force_reply));
141
142        force_reply.selective();
143        assert_eq!(force_reply, reply_markup!(force_reply, selective));
144    }
145
146    #[test]
147    fn test_reply_keyboard() {
148        let mut keyboard = ReplyKeyboardMarkup::new();
149        assert_eq!(keyboard, reply_markup!(reply_keyboard,));
150
151        keyboard.add_empty_row();
152        assert_eq!(keyboard, reply_markup!(reply_keyboard, []));
153
154        {
155            let row = keyboard.add_empty_row();
156            row.push(KeyboardButton::new("foo"));
157            row.push(KeyboardButton::new("bar"));
158        }
159        assert_eq!(keyboard, reply_markup!(reply_keyboard, [], ["foo", "bar"]));
160
161        {
162            let row = keyboard.add_empty_row();
163            row.push(KeyboardButton::new("baz"));
164        }
165        assert_eq!(
166            keyboard,
167            reply_markup!(reply_keyboard, [], ["foo", "bar"], ["baz"])
168        );
169
170        {
171            let row = keyboard.add_empty_row();
172
173            let mut contact_button = KeyboardButton::new("contact");
174            contact_button.request_contact();
175            row.push(contact_button);
176
177            let mut location_button = KeyboardButton::new("location");
178            location_button.request_location();
179            row.push(location_button)
180        }
181        assert_eq!(
182            keyboard,
183            reply_markup!(
184                reply_keyboard, [], ["foo", "bar"], ["baz"],
185                ["contact" contact, "location" location]
186            )
187        );
188
189        {
190            let row = keyboard.add_empty_row();
191            row.push(KeyboardButton::new("spam"));
192        }
193        assert_eq!(
194            keyboard,
195            reply_markup!(
196                reply_keyboard, [], ["foo", "bar"], ["baz"],
197                ["contact" contact, "location" location],
198                ["spam"]
199            )
200        );
201
202        keyboard.selective();
203        assert_eq!(
204            keyboard,
205            reply_markup!(
206                reply_keyboard, selective, [], ["foo", "bar"], ["baz"],
207                ["contact" contact, "location" location],
208                ["spam"]
209            )
210        );
211
212        keyboard.resize_keyboard();
213        assert_eq!(
214            keyboard,
215            reply_markup!(
216                reply_keyboard, resize, selective, [], ["foo", "bar"], ["baz"],
217                ["contact" contact, "location" location],
218                ["spam"]
219            )
220        );
221
222        keyboard.one_time_keyboard();
223        assert_eq!(
224            keyboard,
225            reply_markup!(
226                reply_keyboard, resize, selective, one_time, [], ["foo", "bar"], ["baz"],
227                ["contact" contact, "location" location],
228                ["spam"]
229            )
230        );
231    }
232
233    #[test]
234    fn test_inline_keyboard() {
235        let mut markup = InlineKeyboardMarkup::new();
236        assert_eq!(markup, reply_markup!(inline_keyboard,));
237
238        markup.add_empty_row();
239        assert_eq!(markup, reply_markup!(inline_keyboard, []));
240
241        {
242            let row = markup.add_empty_row();
243            row.push(InlineKeyboardButton::callback("foo", "bar"));
244            row.push(InlineKeyboardButton::callback("baz", "quux"));
245        }
246        assert_eq!(
247            markup,
248            reply_markup!(inline_keyboard, [], ["foo" callback "bar", "baz" callback "quux"])
249        );
250    }
251}