Tokio app structure

This commit is contained in:
2026-07-14 12:48:25 -04:00
parent 712a149735
commit 86bd06f568
3 changed files with 48 additions and 14 deletions
+1
View File
@@ -4,3 +4,4 @@ version = "0.1.0"
edition = "2024"
[dependencies]
tokio = { version = "1.52.3", features = ["sync"] }
+29 -14
View File
@@ -1,31 +1,46 @@
use std::any::Any;
use tokio::sync::mpsc;
pub mod layout;
pub mod render;
pub mod unit;
pub mod widget;
#[derive(Debug, Clone)]
pub struct Context {
tx: mpsc::Sender<Box<dyn Any>>,
}
pub struct Refresh;
pub trait App {
// State
fn init(&mut self);
fn update(&mut self);
fn tick(&self);
#[allow(async_fn_in_trait)]
async fn init(&mut self, ctx: Context);
#[allow(async_fn_in_trait)]
async fn update(&mut self, event: Box<dyn Any>);
// Rendering
fn layout(&self) -> layout::Allocation;
fn render(&mut self, layout: layout::Allocation);
}
fn refresh(&mut self) {
self.render(self.layout());
}
pub struct AppHandler<A: App> {
pub app: A,
}
// Running
fn run(&mut self) {
self.init();
self.refresh();
impl<A: App> AppHandler<A> {
pub async fn run(&mut self) {
let (tx, mut rx) = mpsc::channel(100);
loop {
self.tick();
self.update();
self.refresh();
self.app.init(Context { tx }).await;
self.app.render(self.app.layout());
while let Some(event) = rx.recv().await {
self.app.update(event).await;
self.app.render(self.app.layout());
}
}
}