1#[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}