git_switch_branch/
util.rs1use 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}