55 lines
1.1 KiB
Rust
55 lines
1.1 KiB
Rust
use serde::{Deserialize, Serialize};
|
|
|
|
#[derive(Debug, Deserialize, Serialize)]
|
|
pub struct Message {
|
|
src: String,
|
|
#[serde(rename = "dest")]
|
|
dst: String,
|
|
body: MessageBody,
|
|
}
|
|
#[derive(Debug, Deserialize, Serialize)]
|
|
pub struct MessageBody {
|
|
#[serde(rename = "msg_id")]
|
|
id: Option<u64>,
|
|
in_reply_to: Option<u64>,
|
|
|
|
#[serde(flatten)]
|
|
data: MessagePayload,
|
|
}
|
|
|
|
#[derive(Debug, Deserialize, Serialize, PartialEq)]
|
|
#[serde(tag = "type")]
|
|
#[serde(rename_all = "snake_case")]
|
|
pub enum MessagePayload {
|
|
Init {
|
|
node_id: String,
|
|
#[serde(rename = "node_ids")]
|
|
nodes: Vec<String>,
|
|
},
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn protocol_decode_init() -> color_eyre::Result<()> {
|
|
let json_input = r###"{
|
|
"src": "c1",
|
|
"dest": "n3",
|
|
"body": {
|
|
"type": "init",
|
|
"msg_id": 1,
|
|
"node_id": "n3",
|
|
"node_ids": ["n1", "n2", "n3"]
|
|
}
|
|
}
|
|
"###;
|
|
|
|
let msg = serde_json::from_str::<Message>(json_input)?;
|
|
|
|
assert!(matches!(msg.body.data, MessagePayload::Init { .. }));
|
|
Ok(())
|
|
}
|
|
}
|