commit 10a732af07e35f3b037a0c90191b25e9e52f599a Author: pasterp Date: Mon May 29 16:19:15 2023 +0200 Initial project diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4702cdc --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/target +.vscode/ +Cargo.lock \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..484fc53 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "tourbillon" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +color-eyre = "0.6.2" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..7e28863 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,9 @@ +mod protocol; +use protocol::message::Message; + +fn main() -> color_eyre::Result<()> { + color_eyre::install()?; + + println!("Hello, world!"); + Ok(()) +} diff --git a/src/protocol.rs b/src/protocol.rs new file mode 100644 index 0000000..7397c12 --- /dev/null +++ b/src/protocol.rs @@ -0,0 +1 @@ +pub mod message; \ No newline at end of file diff --git a/src/protocol/message.rs b/src/protocol/message.rs new file mode 100644 index 0000000..b85a3f2 --- /dev/null +++ b/src/protocol/message.rs @@ -0,0 +1,54 @@ +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, + in_reply_to: Option, + + #[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, + }, +} + +#[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::(json_input)?; + + assert!(matches!(msg.body.data, MessagePayload::Init { .. })); + Ok(()) + } +}