code_scanner_driver/
stream.rs

1use tokio::sync::mpsc;
2use tokio_stream::{wrappers::ReceiverStream, Stream};
3use anyhow::Result;
4use crate::event::scanner_event::ScannerEvent;
5use crate::keyboard::manager::start_keyboard_worker;
6
7pub struct ScannerStream {
8    inner: ReceiverStream<ScannerEvent>,
9}
10
11impl ScannerStream {
12    pub fn new() -> Result<Self> {
13        let (tx, rx) = mpsc::channel(64);
14
15        start_keyboard_worker(tx)?;
16
17        Ok(Self {
18            inner: ReceiverStream::new(rx),
19        })
20    }
21}
22
23impl Stream for ScannerStream {
24    type Item = ScannerEvent;
25
26    fn poll_next(
27        mut self: std::pin::Pin<&mut Self>,
28        cx: &mut std::task::Context<'_>,
29    ) -> std::task::Poll<Option<Self::Item>> {
30        std::pin::Pin::new(&mut self.inner).poll_next(cx)
31    }
32}