gossip-glomers/03b-multi-node-broadcast/src/message.rs

62 lines
1.2 KiB
Rust

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<String>,
},
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<u64>,
},
Topology {
msg_id: u64,
topology: HashMap<String, Vec<String>>,
},
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()
}
}