modcli/output/input/
menu.rs

1use 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}"); // Highlighted
24            } else {
25                println!("    {option}"); // Normal
26            }
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}