1#[cfg(feature = "server")]
8#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq)]
10pub struct Transaction {
11 pub id: u64,
13 pub user_id: String,
15 pub amount: f64,
17 pub description: String,
19}
20
21#[cfg(feature = "server")]
22#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq)]
24pub enum NetworkMessageCode {
25 Discovery,
27 Transaction,
29 TransactionAcknowledgement,
31 Acknowledgment,
33 Error,
35 Disconnect,
37 SnapshotRequest,
39 SnapshotResponse,
41 AcquireMutex,
43 ReleaseGlobalMutex,
45 AckGlobalMutex,
47 AckReleaseGlobalMutex,
49}
50
51#[cfg(feature = "server")]
52#[derive(serde::Serialize, serde::Deserialize, Debug, Clone)]
54pub struct Message {
55 pub sender_id: String,
57 pub message_initiator_id: String,
59 pub message_initiator_addr: std::net::SocketAddr,
61 pub sender_addr: std::net::SocketAddr,
63 pub clock: crate::clock::Clock,
65 pub command: Option<crate::control::Command>,
67 pub info: MessageInfo,
69 pub code: NetworkMessageCode,
71}
72
73#[cfg(feature = "server")]
74#[derive(serde::Serialize, serde::Deserialize, Debug, Clone)]
76pub enum MessageInfo {
77 Acknowledge(AcknowledgePayload),
79 CreateUser(CreateUser),
81 Deposit(Deposit),
83 Withdraw(Withdraw),
85 Transfer(Transfer),
87 Pay(Pay),
89 Refund(Refund),
91 SnapshotResponse(SnapshotResponse),
93 AcquireMutex(AcquireMutexPayload),
95 ReleaseMutex(ReleaseMutexPayload),
97 AckMutex(AckMutexPayload),
99 None,
101}
102
103#[cfg(feature = "server")]
104#[derive(serde::Serialize, serde::Deserialize, Clone, Debug)]
106pub struct AcknowledgePayload {
107 pub global_fifo: std::collections::HashMap<String, crate::state::MutexStamp>,
109}
110
111#[cfg(feature = "server")]
112#[derive(serde::Serialize, serde::Deserialize, Clone, Debug)]
114pub struct AcquireMutexPayload;
115
116#[cfg(feature = "server")]
117#[derive(serde::Serialize, serde::Deserialize, Clone, Debug)]
119#[cfg(feature = "server")]
120pub struct ReleaseMutexPayload;
122
123#[cfg(feature = "server")]
124#[derive(serde::Serialize, serde::Deserialize, Clone, Debug)]
126pub struct AckMutexPayload {
127 pub clock: i64,
128}
129
130#[cfg(feature = "server")]
131#[derive(serde::Serialize, serde::Deserialize, Debug, Clone)]
133pub struct SnapshotResponse {
134 pub site_id: String,
136 pub clock: crate::clock::Clock,
138 pub tx_log: Vec<crate::snapshot::TxSummary>,
140}
141
142#[cfg(feature = "server")]
143#[derive(serde::Serialize, serde::Deserialize, Debug, Clone)]
145pub struct CreateUser {
146 pub name: String,
148}
149
150#[cfg(feature = "server")]
151impl CreateUser {
152 pub fn new(name: String) -> Self {
154 Self { name }
155 }
156}
157
158#[cfg(feature = "server")]
159#[derive(serde::Serialize, serde::Deserialize, Debug, Clone)]
161pub struct Deposit {
162 pub name: String,
164 pub amount: f64,
166}
167
168#[cfg(feature = "server")]
169impl Deposit {
170 pub fn new(name: String, amount: f64) -> Self {
172 Self { name, amount }
173 }
174}
175
176#[cfg(feature = "server")]
177#[derive(serde::Serialize, serde::Deserialize, Debug, Clone)]
179pub struct Withdraw {
180 pub name: String,
182 pub amount: f64,
184}
185
186#[cfg(feature = "server")]
187impl Withdraw {
188 pub fn new(name: String, amount: f64) -> Self {
190 Self { name, amount }
191 }
192}
193
194#[cfg(feature = "server")]
195#[derive(serde::Serialize, serde::Deserialize, Debug, Clone)]
197pub struct Transfer {
198 pub name: String,
200 pub beneficiary: String,
202 pub amount: f64,
204}
205
206#[cfg(feature = "server")]
207impl Transfer {
208 pub fn new(name: String, beneficiary: String, amount: f64) -> Self {
210 Self {
211 name,
212 beneficiary,
213 amount,
214 }
215 }
216}
217
218#[cfg(feature = "server")]
219#[derive(serde::Serialize, serde::Deserialize, Debug, Clone)]
221pub struct Pay {
222 pub name: String,
224 pub amount: f64,
226}
227
228#[cfg(feature = "server")]
229impl Pay {
230 pub fn new(name: String, amount: f64) -> Self {
232 Self { name, amount }
233 }
234}
235
236#[cfg(feature = "server")]
237#[derive(serde::Serialize, serde::Deserialize, Debug, Clone)]
239pub struct Refund {
240 pub name: String,
242 pub transac_time: i64,
244 pub transac_node: String,
246}
247
248#[cfg(feature = "server")]
249impl Refund {
250 pub fn new(name: String, transac_time: i64, transac_node: String) -> Self {
252 Self {
253 name,
254 transac_time,
255 transac_node,
256 }
257 }
258}
259
260#[cfg(test)]
261#[cfg(feature = "server")]
262mod tests {
263 use super::*;
264
265 #[test]
266 fn test_transaction_debug() {
267 let transaction = Transaction {
268 id: 1,
269 user_id: "test_user".to_string(),
270 amount: 100.0,
271 description: "Test transaction".to_string(),
272 };
273 assert_eq!(
274 format!("{:?}", transaction),
275 "Transaction { id: 1, user_id: \"test_user\", amount: 100.0, description: \"Test transaction\" }"
276 );
277 }
278
279 #[test]
280 fn test_message_debug() {
281 let clock = crate::clock::Clock::new();
282
283 let message = Message {
284 sender_id: "A".to_string(),
285 sender_addr: "127.0.0.1:8080".parse().unwrap(),
286 message_initiator_id: "A".to_string(),
287 message_initiator_addr: "127.0.0.1:8080".parse().unwrap(),
288 clock: clock,
289 command: None,
290 info: MessageInfo::None,
291 code: NetworkMessageCode::Transaction,
292 };
293 assert!(format!("{:?}", message).contains("Message { sender_id: \"A\""));
294 }
295}