oxid8 0.1.0

CHIP-8 interpreter.
Documentation
use crate::screens::Screen;
use crate::screens::{game::Game, menu::Menu};

use ratatui::{DefaultTerminal, Frame};
use std::io;

#[derive(Default)]
pub struct App {
    menu: Menu,
    game: Game,
    state: AppState,
}

#[derive(Default)]
pub struct AppState {
    pub should_exit: bool,
    pub screen: Screen,
    pub rom_path: Option<std::path::PathBuf>,
}

impl App {
    pub fn run(mut self, terminal: &mut DefaultTerminal) -> io::Result<()> {
        while !self.state.should_exit {
            terminal.draw(|frame| self.draw(frame))?;
            self.handle_events()?;
        }
        Ok(())
    }

    fn draw(&mut self, frame: &mut Frame) {
        match self.state.screen {
            Screen::Debug => (),
            Screen::Menu => self.menu.draw(frame),
            Screen::Game => self.game.draw(frame),
        }
    }

    fn handle_events(&mut self) -> io::Result<()> {
        match self.state.screen {
            Screen::Debug => (),
            Screen::Menu => self.menu.handle_events(&mut self.state)?,
            Screen::Game => self.game.handle_events(&mut self.state)?,
        }
        Ok(())
    }
}