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 }