Layers/src/ipc_runtime.rs

34 lines
1.0 KiB
Rust

//! Bridges the async `kicad_worker` stream to a sync mpsc Receiver for the render loop.
use std::sync::mpsc;
use std::thread;
use crate::ipc::worker::kicad_worker;
use crate::ipc::Event;
pub fn spawn_worker() -> mpsc::Receiver<Event> {
let (tx, rx) = mpsc::channel();
thread::Builder::new()
.name("layers-ipc".to_string())
.spawn(move || {
let Ok(rt) = tokio::runtime::Builder::new_current_thread()
.enable_all()
.build()
else {
tracing::error!("layers-ipc: failed to build tokio runtime");
return;
};
rt.block_on(async move {
use iced::futures::StreamExt;
let mut stream = Box::pin(kicad_worker());
while let Some(event) = stream.next().await {
if tx.send(event).is_err() {
break;
}
}
});
})
.expect("spawn layers-ipc thread");
rx
}