arostech_cli_rust/models/
menu_options.rsuse colored::Colorize;
use std::io::{self, Write};
use super::menu_item::MenuItem;
pub struct MenuOptions {
options: Vec<MenuItem>
}
impl MenuOptions {
pub fn new() -> MenuOptions {
MenuOptions {
options: create_options()
}
}
pub fn clone(&self) -> Vec<String> {
let string_options: Vec<String> = self.options.iter().map(|menu_item: &MenuItem|{
menu_item.name.clone()
}).collect();
return string_options;
}
pub fn run (&self, choice: String) -> bool {
match self.options.iter().find(|item|item.name == choice) {
Some(item) => {
print!("{}[2J", 27 as char);
println!("{}{}","Action: ".green(),item.name);
println!("\n");
let should_exit_after: (bool, String) = (item.action)();
println!("{}", should_exit_after.1);
should_exit_after.0
},
None => {
println!("Error: Option not found");
false
}
}
}
}
fn create_options ()-> Vec<MenuItem>{
vec![
MenuItem {
name: "Visit arostech.dk".to_string(),
action: ||{
println!("... Opening browser");
let _ = open::that("https://arostech.dk");
(true, "... Opening browser".to_string())
}
},
MenuItem {
name: "SSH into Cloudways".to_string(),
action: ||{
(false, "SSH_CLOUDWAYS".to_string())
}
},
MenuItem {
name: "Exit".to_string(),
action: ||{
println!("Goodbye.");
(false, "EXIT".to_string())
}
}
]
}