/ tui / src / main.rs
main.rs
 1  use std::io;
 2  
 3  mod app;
 4  mod effects;
 5  mod ui;
 6  
 7  use app::App;
 8  
 9  #[cfg(not(target_arch = "wasm32"))]
10  use {
11      crossterm::event::{self, Event, KeyCode, KeyEventKind},
12      ratatui::DefaultTerminal,
13      std::time::Duration,
14  };
15  
16  #[cfg(target_arch = "wasm32")]
17  use ratzilla::{
18      CanvasBackend, WebRenderer,
19      event::KeyCode,
20      ratatui::{Terminal, style::Color},
21  };
22  
23  #[cfg(not(target_arch = "wasm32"))]
24  fn handle_key_code(app: &mut App, key_code: KeyCode) {
25      match key_code {
26          KeyCode::Right => app.on_right(),
27          KeyCode::Left => app.on_left(),
28          KeyCode::Up => app.on_up(),
29          KeyCode::Down => app.on_down(),
30          KeyCode::Char(character) => app.on_key(character),
31          _ => {}
32      }
33  }
34  
35  #[cfg(not(target_arch = "wasm32"))]
36  fn run_native(app: &mut App, terminal: &mut DefaultTerminal) -> io::Result<()> {
37      while !app.should_quit {
38          if event::poll(Duration::from_millis(16))?
39              && let Event::Key(key_event) = event::read()?
40              && key_event.kind == KeyEventKind::Press
41          {
42              handle_key_code(app, key_event.code);
43          }
44  
45          let elapsed = app.on_tick();
46          terminal.draw(|frame| ui::draw(elapsed, frame, app))?;
47      }
48  
49      Ok(())
50  }
51  
52  #[cfg(not(target_arch = "wasm32"))]
53  fn main() -> io::Result<()> {
54      let mut terminal = ratatui::init();
55      let mut app = App::new(" 🔱 Mumtahin Farabi 🔱 ", false);
56      let app_result = run_native(&mut app, &mut terminal);
57      ratatui::restore();
58      app_result
59  }
60  
61  #[cfg(target_arch = "wasm32")]
62  fn main() -> io::Result<()> {
63      let app_state = std::rc::Rc::new(std::cell::RefCell::new(App::new(
64          " 🔱 Mumtahin Farabi 🔱 ",
65          false,
66      )));
67  
68      let mut backend = CanvasBackend::new()?;
69      backend.set_background_color(Color::Rgb(1, 1, 1));
70      let terminal = Terminal::new(backend)?;
71  
72      terminal.on_key_event({
73          let app_state = app_state.clone();
74          move |event| {
75              let mut app = app_state.borrow_mut();
76              match event.code {
77                  KeyCode::Right => app.on_right(),
78                  KeyCode::Left => app.on_left(),
79                  KeyCode::Up => app.on_up(),
80                  KeyCode::Down => app.on_down(),
81                  KeyCode::Char(character) => app.on_key(character),
82                  _ => {}
83              }
84          }
85      });
86  
87      terminal.draw_web(move |frame| {
88          let mut app = app_state.borrow_mut();
89          let elapsed = app.on_tick();
90          ui::draw(elapsed, frame, &mut app);
91      });
92  
93      Ok(())
94  }