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 = ["🍕 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 selected = selected.saturating_sub(1);
35 }
36 KeyCode::Down => {
37 if selected < options.len() - 1 {
38 selected += 1;
39 }
40 }
41 KeyCode::Enter => {
42 terminal::disable_raw_mode().unwrap();
43 return Some(selected);
44 }
45 KeyCode::Esc => {
46 terminal::disable_raw_mode().unwrap();
47 return None;
48 }
49 _ => {}
50 }
51 }
52 }
53}