Implemented commandExecutor logic

This commit is contained in:
2026-01-28 23:33:22 +01:00
parent 63abf41094
commit 1df6cd4c5e
6 changed files with 68 additions and 2 deletions
+4
View File
@@ -87,4 +87,8 @@ impl<T: Engine> Engine for Benchmark<T> {
fn render_delay(&self) {
self.0.render_delay();
}
fn executor(&self) -> Arc<dyn super::CommandExecutor> {
self.0.executor()
}
}
+1
View File
@@ -0,0 +1 @@
pub struct Stop;
+50 -1
View File
@@ -5,18 +5,31 @@ use std::{
use crossterm::{cursor::MoveTo, execute, terminal::Clear};
use crate::{prelude::Context, render::Area, DrawContext, View};
use crate::{
engine::{commands, CommandExecutor},
prelude::Context,
render::Area,
DrawContext, View,
};
use super::Engine;
pub struct ConsoleExecutor {
running: Mutex<bool>,
}
pub struct Console {
threads: Mutex<Vec<Arc<dyn Fn(Arc<Context>) + Send + Sync>>>,
executor: Arc<ConsoleExecutor>,
}
impl Console {
pub fn new() -> Self {
Self {
threads: Mutex::new(Vec::new()),
executor: Arc::new(ConsoleExecutor {
running: Mutex::new(true),
}),
}
}
@@ -84,4 +97,40 @@ impl Engine for Console {
cx
}
fn executor(&self) -> Arc<dyn super::CommandExecutor> {
self.executor.clone()
}
fn run<F: Fn(&Arc<Context>) -> View + Send + Sync + 'static>(&self, component: F) {
let cx = self.init(component);
while self.executor.is_running() {
self.render(&cx);
self.render_delay();
}
}
}
impl ConsoleExecutor {
pub fn is_running(self: &Arc<ConsoleExecutor>) -> bool {
*self.running.lock().unwrap()
}
pub fn stop(&self) -> crate::Result<()> {
*self.running.lock()? = false;
Ok(())
}
}
impl CommandExecutor for ConsoleExecutor {
fn execute_command(&self, command: &Arc<dyn super::Command>) -> crate::Result<()> {
let command = command.as_any();
if let Some(commands::Stop) = command.downcast_ref() {
self.stop()?;
}
Ok(())
}
}
+2
View File
@@ -1,4 +1,5 @@
pub mod benchmark;
pub mod commands;
pub mod console;
pub use benchmark::*;
@@ -29,6 +30,7 @@ pub trait Engine {
fn render_view(&self, area: &Area, view: &View) -> DrawContext;
fn draw_context(&self, ctx: &DrawContext);
fn executor(&self) -> Arc<dyn CommandExecutor>;
}
pub trait Command {