rsiot/components/shared_tasks/
mpsc_to_msgbus.rs

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