1use std::{fmt::Debug, sync::Arc};
2
3use tokio::sync::{broadcast, watch};
4
5pub type Buffer = Arc<Vec<u8>>;
6
7pub trait Subsystem<'fr>: Sized {
18 type Output: Send + 'static;
19 type Error: Debug + Send + 'static;
20
21 async fn init() -> Result<Self, Self::Error>;
23 fn process(&mut self, buf: Buffer) -> Result<Self::Output, Self::Error>;
25}
26
27async fn run<'fr, S: Subsystem<'fr>>(mut rx: watch::Receiver<Arc<Vec<u8>>>) {
29 let mut subsys = S::init().await.unwrap();
30
31 while let Ok(()) = rx.changed().await {
32 let buf = rx.borrow_and_update();
33 S::process(&mut subsys, buf.clone()).unwrap();
34 }
35}
36
37pub struct SubsysHandle<T: Sized> {
38 tx: watch::Sender<Buffer>,
39 rx: broadcast::Receiver<T>,
40}