main.rs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. use std::{
  2. io,
  3. io::Read,
  4. time::{Duration, Instant},
  5. };
  6. use termion::{async_stdin, event::Key, input::TermRead, raw::IntoRawMode};
  7. use tui::{
  8. backend::{Backend, TermionBackend},
  9. Terminal,
  10. };
  11. pub mod app;
  12. pub mod list;
  13. pub mod types;
  14. pub mod ui;
  15. use crate::app::App;
  16. fn main() -> Result<(), io::Error> {
  17. // Set up terminal output
  18. let stdout = io::stdout().into_raw_mode()?;
  19. let backend = TermionBackend::new(stdout);
  20. let mut terminal = Terminal::new(backend)?;
  21. // create app and run it
  22. let tick_rate = Duration::from_millis(250);
  23. // here
  24. let app = App::new();
  25. let res = run_app(&mut terminal, app, tick_rate);
  26. terminal.clear()?;
  27. if let Err(err) = res {
  28. println!("{:?}", err)
  29. }
  30. Ok(())
  31. }
  32. fn run_app<B: Backend>(
  33. terminal: &mut Terminal<B>,
  34. mut app: App,
  35. tick_rate: Duration,
  36. ) -> io::Result<()> {
  37. let mut asi = async_stdin();
  38. terminal.clear()?;
  39. let mut last_tick = Instant::now();
  40. loop {
  41. terminal.draw(|f| ui::ui(f, &mut app))?;
  42. for k in asi.by_ref().keys() {
  43. match k.unwrap() {
  44. Key::Char('q') => {
  45. terminal.clear()?;
  46. return Ok(())
  47. }
  48. Key::Char('j') => app.node_list.next(),
  49. Key::Char('k') => app.node_list.previous(),
  50. _ => (),
  51. }
  52. }
  53. if last_tick.elapsed() >= tick_rate {
  54. last_tick = Instant::now();
  55. }
  56. }
  57. }