+use std::future::Future;
+use std::pin::Pin;
use sea_orm::{ActiveModelTrait, Database, DatabaseConnection, DbErr, EntityTrait, QueryFilter, ColumnTrait, Set};
use tokio::runtime::Runtime;
use std::sync::{Arc};
+use tokio::sync::mpsc;
+use tokio::sync::mpsc::UnboundedSender;
use migration::{Migrator, MigratorTrait};
use ui_rs::ui;
pub current_profile: Option<profile::Model>,
}
+type CmdFuture = Pin<Box<dyn Future<Output = ()> + Send>>;
+pub trait Cmd: Send {
+ fn run(self: Box<Self>, backend: Arc<Backend>) -> CmdFuture;
+}
+
+pub type DynCmd = Box<dyn Cmd>;
+
+pub struct BackendHandle {
+ tx: UnboundedSender<DynCmd>,
+}
+
+
+
impl Backend {
pub fn new() -> Result<Self, DbErr> {
let rt = Arc::new(
Ok(profile)
}
+
+ pub fn start(self) -> BackendHandle {
+ let backend = Arc::new(self);
+
+ let (tx, mut rx) = mpsc::unbounded_channel::<DynCmd>();
+
+ let rt = backend.rt.clone();
+
+ std::thread::spawn(move || {
+ rt.block_on(async move {
+ while let Some(cmd) = rx.recv().await {
+ let backend = backend.clone();
+
+ tokio::spawn(async move {
+ cmd.run(backend).await;
+ });
+ }
+ });
+ });
+
+ BackendHandle { tx }
+ }
}
mod backend;
use std::env;
+use tokio::sync::mpsc;
use ui_rs::{ui};
use ui_rs::ui::*;
-use crate::backend::Backend;
+use crate::backend::{Backend, BackendHandle, DynCmd};
use crate::window::*;
fn main() {
}
};
- let mut app = App { backend: backend };
+ let handle = backend.start();
+
+ let mut app = App { backend: handle };
ui::app_run::<MainWindow>(&mut app);
}
}
struct App {
- backend: Backend,
+ backend: BackendHandle,
}