git_switch_branch/
util.rs

1use crossterm::event::{self, Event, KeyEvent, KeyEventKind};
2use std::time::Duration;
3
4pub struct CircularCounter {
5    pub size: usize,
6    pub selected: usize,
7}
8
9impl CircularCounter {
10    pub fn next(&mut self) -> usize {
11        self.selected = (self.selected + 1) % self.size;
12        self.selected
13    }
14
15    pub fn prev(&mut self) -> usize {
16        if self.selected == 0 {
17            self.selected = self.size - 1;
18        } else {
19            self.selected -= 1;
20        }
21        self.selected
22    }
23}
24
25pub fn poll_keypress(timeout: Duration) -> std::io::Result<Option<KeyEvent>> {
26    if event::poll(timeout)? {
27        if let Event::Key(event) = event::read()? {
28            if event.kind != KeyEventKind::Release {
29                return Ok(Some(event));
30            }
31        }
32    }
33    Ok(None)
34}
35
36#[macro_export]
37macro_rules! fatal {
38    ($($arg:tt)*) => {{
39        eprintln!($($arg)*);
40        std::process::exit(1);
41    }};
42}