rsiot/message/
msg_trace.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
use std::collections::HashSet;

use serde::{Deserialize, Serialize};
use uuid::Uuid;

use super::Timestamp;

/// Запись пути
#[derive(Debug, Clone, Deserialize, PartialEq, Serialize)]
struct MsgTraceItem {
    id: Uuid,
    ts: Timestamp,
    // name: String,
}

/// Структура для представления пути, по которому передавалось сообщение
#[derive(Debug, Default, Clone, Deserialize, PartialEq, Serialize)]
pub struct MsgTrace(Vec<MsgTraceItem>);

impl MsgTrace {
    /// Создать новый уникальный идентификатор
    ///
    /// TODO - возможно заменить на что-то более компактное - например snowflake
    pub fn generate_uuid() -> Uuid {
        Uuid::new_v4()
    }

    /// Добавить запись пути
    pub fn add_trace_item(&mut self, id: Uuid) {
        let ts = Timestamp::default();
        let value = MsgTraceItem { ts, id };
        self.0.push(value);
    }

    /// Определяет, есть ли в пути запись с заданным id
    pub fn contains_trace_item(&self, id: &Uuid) -> bool {
        self.0.iter().any(|tv| &tv.id == id)
    }

    /// Возвращает все идентификаторы пути сообщения
    pub fn get_ids(self) -> HashSet<Uuid> {
        self.0.iter().map(|i| i.id).collect()
    }
}