rsiot/message/
msg_trace.rs

1use std::collections::HashSet;
2
3use serde::{Deserialize, Serialize};
4use uuid::Uuid;
5
6use super::Timestamp;
7
8/// Запись пути
9#[derive(Debug, Clone, Deserialize, PartialEq, Serialize)]
10struct MsgTraceItem {
11    id: Uuid,
12    ts: Timestamp,
13    // name: String,
14}
15
16/// Структура для представления пути, по которому передавалось сообщение
17#[derive(Debug, Default, Clone, Deserialize, PartialEq, Serialize)]
18pub struct MsgTrace(Vec<MsgTraceItem>);
19
20impl MsgTrace {
21    /// Создать новый уникальный идентификатор
22    ///
23    /// TODO - возможно заменить на что-то более компактное - например snowflake
24    pub fn generate_uuid() -> Uuid {
25        Uuid::new_v4()
26    }
27
28    /// Добавить запись пути
29    pub fn add_trace_item(&mut self, id: Uuid) {
30        let ts = Timestamp::default();
31        let value = MsgTraceItem { ts, id };
32        self.0.push(value);
33    }
34
35    /// Определяет, есть ли в пути запись с заданным id
36    pub fn contains_trace_item(&self, id: &Uuid) -> bool {
37        self.0.iter().any(|tv| &tv.id == id)
38    }
39
40    /// Возвращает все идентификаторы пути сообщения
41    pub fn get_ids(self) -> HashSet<Uuid> {
42        self.0.iter().map(|i| i.id).collect()
43    }
44}