use ratatui::{Frame, crossterm::event::Event};
use crate::{
PostEventAction,
errors::Error,
screen::{details_screen::DetailsScreen, log_screen::LogScreen, tests_screen::TestsScreen},
};
pub mod details_screen;
pub mod log_screen;
pub mod tests_screen;
pub enum Screen {
TestsScreen(Box<TestsScreen>),
LogScreen(LogScreen),
DetailsScreen(DetailsScreen),
}
impl From<Box<TestsScreen>> for Screen {
fn from(value: Box<TestsScreen>) -> Self {
Screen::TestsScreen(value)
}
}
impl From<LogScreen> for Screen {
fn from(value: LogScreen) -> Self {
Screen::LogScreen(value)
}
}
impl From<DetailsScreen> for Screen {
fn from(value: DetailsScreen) -> Self {
Screen::DetailsScreen(value)
}
}
impl Screen {
pub async fn update(&mut self) -> Result<bool, Error> {
match self {
Screen::TestsScreen(tests_screen) => tests_screen.update().await,
_ => Ok(false),
}
}
pub fn handle_event(&mut self, event: Event) -> Result<Option<PostEventAction>, Error> {
match self {
Screen::TestsScreen(tests_screen) => tests_screen.handle_event(event),
Screen::LogScreen(log_screen) => Ok(log_screen.handle_event(event)),
Screen::DetailsScreen(details_screen) => Ok(details_screen.handle_event(event)),
}
}
pub fn render(&mut self, frame: &mut Frame) {
match self {
Screen::TestsScreen(tests_screen) => tests_screen.render(frame),
Screen::LogScreen(log_screen) => log_screen.render(frame),
Screen::DetailsScreen(details_screen) => details_screen.render(frame),
}
}
}