Skip to main content

rsiot/components/shared_tasks/
mpsc_to_broadcast.rs

1//! Задача перенаправления сообщений из канала `mpsc` в `broadcast`
2
3use tokio::sync::{broadcast, mpsc};
4
5use crate::executor::ComponentError;
6
7/// Задача перенаправления сообщений из канала `mpsc` в `broadcast`
8pub struct Task<T> {
9    /// Входящие сообщения
10    pub input: mpsc::Receiver<T>,
11
12    /// Исходящие сообщения
13    pub output: broadcast::Sender<T>,
14}
15
16impl<T> Task<T> {
17    /// Запуск на выполнение
18    pub async fn spawn(mut self) -> Result<(), Error> {
19        while let Some(msg) = self.input.recv().await {
20            self.output.send(msg).map_err(|_| Error::BroadcastSend)?;
21        }
22        Ok(())
23    }
24}
25
26#[allow(missing_docs)]
27#[derive(thiserror::Error, Debug)]
28pub enum Error {
29    #[error(transparent)]
30    Component(#[from] ComponentError),
31
32    #[error("BroadcastSend")]
33    BroadcastSend,
34}