rsiot/components/shared_tasks/
change_mpsc_msg.rs

1//! Замена сообщения
2
3use tokio::sync::mpsc::{Receiver, Sender};
4
5/// Замена сообщения
6pub struct ChangeMpscMsg<TInput, TOutput> {
7    /// Входящий поток сообщений
8    pub input: Receiver<TInput>,
9    /// Исходящий поток сообщений
10    pub output: Sender<TOutput>,
11    /// Функция изменения сообщения
12    pub fn_change: fn(TInput) -> TOutput,
13}
14
15impl<TInput, TOutput> ChangeMpscMsg<TInput, TOutput> {
16    /// Запуск на выполнение
17    pub async fn spawn(mut self) -> Result<(), Error> {
18        while let Some(input_msg) = self.input.recv().await {
19            let output_msg = (self.fn_change)(input_msg);
20            self.output
21                .send(output_msg)
22                .await
23                .map_err(|e| Error::TokioSyncMpsc(e.to_string()))?;
24        }
25        Ok(())
26    }
27}
28
29#[allow(missing_docs)]
30#[derive(thiserror::Error, Debug)]
31pub enum Error {
32    #[error("{0}")]
33    TokioSyncMpsc(String),
34}