rsiot/components/shared_tasks/
mpsc_to_broadcast.rs

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