rsiot_channel_utils/
component_cache.rs

1//! Компонент для сохранения сообщений в кеше
2
3use std::{collections::HashMap, sync::Arc};
4
5use tokio::sync::{mpsc, Mutex};
6
7use rsiot_messages_core::IMessage;
8
9pub type CacheType<TMessage> = Arc<Mutex<HashMap<String, TMessage>>>;
10
11/// Компонент для сохранения сообщений в кеше. Сохраняется только последний
12/// вариант
13///
14/// Входящие сообщения пересылаются без изменений в исходящие
15///
16/// Кеш представляет собой `HashMap`, а точнее
17/// `Arc<Mutex<HashMap<String, TMessage>>>`
18pub async fn component_cache<TMessage>(
19    mut input: mpsc::Receiver<TMessage>,
20    output: Option<mpsc::Sender<TMessage>>,
21    cache: CacheType<TMessage>,
22) where
23    TMessage: IMessage,
24{
25    while let Some(msg) = input.recv().await {
26        {
27            let mut lock = cache.lock().await;
28            lock.insert(msg.key().clone(), msg.clone());
29        }
30        if let Some(output) = &output {
31            output.send(msg).await.unwrap()
32        }
33    }
34}
35
36/// Создать пустой кеш
37pub fn create_cache<TMessage>() -> CacheType<TMessage> {
38    Arc::new(Mutex::new(HashMap::new()))
39}