Initial project

This commit is contained in:
pasterp 2023-05-29 16:19:15 +02:00
commit 10a732af07
5 changed files with 78 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
/target
.vscode/
Cargo.lock

11
Cargo.toml Normal file
View File

@ -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"

9
src/main.rs Normal file
View File

@ -0,0 +1,9 @@
mod protocol;
use protocol::message::Message;
fn main() -> color_eyre::Result<()> {
color_eyre::install()?;
println!("Hello, world!");
Ok(())
}

1
src/protocol.rs Normal file
View File

@ -0,0 +1 @@
pub mod message;

54
src/protocol/message.rs Normal file
View File

@ -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<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(())
}
}