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 = 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); // 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                    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}