From eaafe83dae4c12d44c9c7672a3b02c04b110cf6b Mon Sep 17 00:00:00 2001 From: Santo Cariotti Date: Thu, 5 Aug 2021 19:16:49 +0200 Subject: feat: create a module to manage the keyboard response --- src/keyboard.rs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/keyboard.rs (limited to 'src/keyboard.rs') diff --git a/src/keyboard.rs b/src/keyboard.rs new file mode 100644 index 0000000..ea57d66 --- /dev/null +++ b/src/keyboard.rs @@ -0,0 +1,35 @@ +use std::collections::HashMap; +use teloxide::types::{InlineKeyboardButton, InlineKeyboardMarkup}; + +/// Create a new InlineKeyboardMarkup from an `hashmap` defined as `:` +pub async fn make_inline_keyboard( + hashmap: &Option>, + callback_type: &str, +) -> InlineKeyboardMarkup { + // This is an array of array because the `InlineKeyboardMarkup` + // considers each array as a row. + // So, using this format Vec> will print a button + // in `n` different rows in only 1 column. + let mut keyboard_array: Vec> = vec![]; + + if let Some(options) = hashmap { + for (key, value) in options { + keyboard_array.push(vec![InlineKeyboardButton::callback( + value.clone(), + format!("{}_{}", callback_type, key), + )]); + } + } else { + // If the response of the Option ``callback_type`` is None, just answer + // an useless button with a text. + // I still don't know if it's a good idea to use a callback instead of + // a normal text button, but I could handle any such kind of callback + keyboard_array.push(vec![InlineKeyboardButton::callback( + "No such element".to_string(), + "".into(), + )]); + } + + // The `new` method accepts an interator + return InlineKeyboardMarkup::new(keyboard_array); +} -- cgit v1.2.3-18-g5258