modcli/output/input/
menu.rs1use crossterm::{
2 cursor,
3 event::{self, Event, KeyCode},
4 execute,
5 terminal::{self, ClearType},
6};
7use std::io::{stdout, Write};
8
9pub fn interactive_menu() -> Option<usize> {
10 let mut stdout = stdout();
11 let options = vec!["🍕 Pizza", "🍔 Burger", "🌮 Taco", "❌ Exit"];
12 let mut selected = 0;
13
14 terminal::enable_raw_mode().unwrap();
15 execute!(stdout, terminal::Clear(ClearType::All)).unwrap();
16
17 loop {
18 execute!(stdout, cursor::MoveTo(0, 0)).unwrap();
19
20 println!("\nPick your poison:\n");
21 for (i, option) in options.iter().enumerate() {
22 if i == selected {
23 println!(" > {}", option); } else {
25 println!(" {}", option); }
27 }
28
29 stdout.flush().unwrap();
30
31 if let Event::Key(key_event) = event::read().unwrap() {
32 match key_event.code {
33 KeyCode::Up => {
34 if selected > 0 {
35 selected -= 1;
36 }
37 }
38 KeyCode::Down => {
39 if selected < options.len() - 1 {
40 selected += 1;
41 }
42 }
43 KeyCode::Enter => {
44 terminal::disable_raw_mode().unwrap();
45 return Some(selected);
46 }
47 KeyCode::Esc => {
48 terminal::disable_raw_mode().unwrap();
49 return None;
50 }
51 _ => {}
52 }
53 }
54 }
55}