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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
use chrono::Utc;
use uuid::Uuid;

#[derive(Clone, PartialEq, Debug)]
pub enum Metadata {
    BaseTime(BaseTime),
    UpstreamOpen(UpstreamOpen),
    UpstreamAbnormalClose(UpstreamAbnormalClose),
    UpstreamResume(UpstreamResume),
    UpstreamNormalClose(UpstreamNormalClose),
    DownstreamOpen(DownstreamOpen),
    DownstreamAbnormalClose(DownstreamAbnormalClose),
    DownstreamResume(DownstreamResume),
    DownstreamNormalClose(DownstreamNormalClose),
}

#[derive(Clone, PartialEq, Debug)]
pub enum SendableMetadata {
    BaseTime(BaseTime),
}

#[derive(Clone, PartialEq, Debug)]
pub enum ReceivableMetadata {
    BaseTime(BaseTime),
    UpstreamOpen(UpstreamOpen),
    UpstreamAbnormalClose(UpstreamAbnormalClose),
    UpstreamResume(UpstreamResume),
    UpstreamNormalClose(UpstreamNormalClose),
    DownstreamOpen(DownstreamOpen),
    DownstreamAbnormalClose(DownstreamAbnormalClose),
    DownstreamResume(DownstreamResume),
    DownstreamNormalClose(DownstreamNormalClose),
}

impl Default for Metadata {
    fn default() -> Self {
        Self::BaseTime(BaseTime::default())
    }
}

/// 基準時刻です。
///
/// あるセッションの基準となる時刻です。
#[derive(Clone, PartialEq, Debug)]
pub struct BaseTime {
    /// セッションID
    pub session_id: String,
    /// 基準時刻の名称
    pub name: String,
    /// 優先度
    pub priority: u32,
    /// 経過時間
    pub elapsed_time: chrono::Duration,
    /// 基準時刻
    pub base_time: chrono::DateTime<Utc>,
}

impl Default for BaseTime {
    fn default() -> Self {
        Self {
            session_id: String::new(),
            name: String::new(),
            priority: 0,
            elapsed_time: chrono::Duration::zero(),
            base_time: chrono::DateTime::<Utc>::MIN_UTC,
        }
    }
}

/// あるアップストリームが開いたことを知らせるメタデータです。
#[derive(Clone, PartialEq, Default, Debug)]
pub struct UpstreamOpen {
    /// ストリームID
    pub stream_id: Uuid,
    /// セッションID
    pub session_id: String,
    /// QoS
    pub qos: super::QoS,
}

/// あるアップストリームが異常切断したことを知らせるメタデータです。
#[derive(Clone, PartialEq, Default, Debug)]
pub struct UpstreamAbnormalClose {
    /// ストリームID
    pub stream_id: Uuid,
    /// セッションID
    pub session_id: String,
}

/// あるアップストリームが再開したことを知らせるメタデータです。
#[derive(Clone, PartialEq, Default, Debug)]
pub struct UpstreamResume {
    /// ストリームID
    pub stream_id: Uuid,
    /// セッションID
    pub session_id: String,
    /// QoS
    pub qos: super::QoS,
}

/// あるアップストリームが正常切断したことを知らせるメタデータです。
#[derive(Clone, PartialEq, Default, Debug)]
pub struct UpstreamNormalClose {
    /// ストリームID
    pub stream_id: Uuid,
    /// セッションID
    pub session_id: Uuid,
    /// 総データポイント数
    pub total_data_points: u64,
    /// 最終シーケンス番号
    pub final_sequence_number: u32,
}

/// あるダウンストリームが開いたことを知らせるメタデータです。
#[derive(Clone, PartialEq, Default, Debug)]
pub struct DownstreamOpen {
    /// ストリームID
    pub stream_id: Uuid,
    /// ダウンストリームフィルタ
    pub downstream_filters: Vec<super::DownstreamFilter>,
    /// QoS
    pub qos: super::QoS,
}

/// あるダウンストリームが異常切断したことを知らせるメタデータです。
#[derive(Clone, PartialEq, Default, Debug)]
pub struct DownstreamAbnormalClose {
    /// ストリームID
    pub stream_id: Uuid,
}

/// あるダウンストリームが再開したことを知らせるメタデータです。
#[derive(Clone, PartialEq, Default, Debug)]
pub struct DownstreamResume {
    /// ストリームID
    pub stream_id: Uuid,
    /// ダウンストリームフィルタ
    pub downstream_filters: Vec<super::DownstreamFilter>,
    /// QoS
    pub qos: super::QoS,
}

/// あるダウンストリームが正常切断したことを知らせるメタデータです。
#[derive(Clone, PartialEq, Default, Debug)]
pub struct DownstreamNormalClose {
    /// ストリームID
    pub stream_id: Uuid,
}

/// アップストリームメタデータです。
#[derive(Clone, PartialEq, Debug)]
pub struct UpstreamMetadata {
    /// リクエストID
    pub request_id: super::RequestId,
    /// メタデータ
    pub metadata: SendableMetadata,
    /// 拡張フィールドに含まれている永続化フラグ
    pub persist: Option<bool>,
}

impl Default for UpstreamMetadata {
    fn default() -> Self {
        Self {
            request_id: 0.into(),
            metadata: SendableMetadata::BaseTime(BaseTime::default()),
            persist: None,
        }
    }
}

/// アップストリームメタデータに対する応答です。
#[derive(Clone, PartialEq, Default, Debug)]
pub struct UpstreamMetadataAck {
    /// リクエストID
    pub request_id: super::RequestId,
    /// 結果コード
    pub result_code: super::ResultCode,
    /// 結果文字列
    pub result_string: String,
}

/// ダウンストリームメタデータです。
///
/// メタデータを格納してブローカーからノードへ転送するためのメッセージです。
#[derive(Clone, PartialEq, Debug)]
pub struct DownstreamMetadata {
    /// リクエストID
    pub request_id: super::RequestId,
    /// ストリームIDエイリアス
    pub stream_id_alias: u32,
    /// 生成元ノードID
    pub source_node_id: String,
    /// メタデータ
    pub metadata: ReceivableMetadata,
}

impl Default for DownstreamMetadata {
    fn default() -> Self {
        Self {
            request_id: 0.into(),
            stream_id_alias: 0,
            source_node_id: "".to_string(),
            metadata: ReceivableMetadata::BaseTime(BaseTime::default()),
        }
    }
}

/// ダウンストリームメタデータに対する応答です。
#[derive(Clone, PartialEq, Default, Debug)]
pub struct DownstreamMetadataAck {
    /// リクエストID
    pub request_id: super::RequestId,
    /// 結果コード
    pub result_code: super::ResultCode,
    /// 結果文字列
    pub result_string: String,
}