use serde::{Deserialize, Serialize}; use std::collections::HashMap; #[derive(Clone, Serialize, Deserialize, Debug)] pub struct Message { pub src: String, pub dest: String, pub body: Body, } #[derive(Clone, Serialize, Deserialize, Debug)] #[serde(tag = "type")] #[serde(rename_all = "snake_case")] pub enum Body { Error { in_reply_to: u64, code: u64, text: String, }, Init { msg_id: u64, node_id: String, node_ids: Vec, }, InitOk { in_reply_to: u64, }, Broadcast { msg_id: u64, message: u64, }, BroadcastOk { msg_id: u64, in_reply_to: u64, }, Read { msg_id: u64, }, ReadOk { msg_id: u64, in_reply_to: u64, messages: Vec, }, Topology { msg_id: u64, topology: HashMap>, }, TopologyOk { msg_id: u64, in_reply_to: u64, }, } impl Message { pub(crate) fn parse_message(message: String) -> Message { serde_json::from_str(&message).unwrap() } pub(crate) fn format_message(message: Message) -> String { serde_json::to_string(&message).unwrap() } }