2023-05-09 17:39:59 +00:00
|
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
|
use std::io::{self, BufRead, Write};
|
2023-05-11 19:18:01 +00:00
|
|
|
use uuid7::Uuid;
|
2023-05-09 17:39:59 +00:00
|
|
|
|
|
|
|
|
#[derive(Serialize, Deserialize, Debug)]
|
|
|
|
|
struct Message {
|
|
|
|
|
src: String,
|
|
|
|
|
dest: String,
|
|
|
|
|
body: Body,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Serialize, Deserialize, Debug)]
|
|
|
|
|
#[serde(tag = "type")]
|
|
|
|
|
enum Body {
|
|
|
|
|
#[serde(rename = "init")]
|
|
|
|
|
Init {
|
|
|
|
|
msg_id: u64,
|
|
|
|
|
node_id: String,
|
|
|
|
|
node_ids: Vec<String>,
|
|
|
|
|
},
|
|
|
|
|
#[serde(rename = "init_ok")]
|
|
|
|
|
InitOk { in_reply_to: u64 },
|
2023-05-11 19:18:01 +00:00
|
|
|
#[serde(rename = "generate")]
|
|
|
|
|
Generate {
|
|
|
|
|
msg_id: u64,
|
|
|
|
|
},
|
|
|
|
|
#[serde(rename = "generate_ok")]
|
|
|
|
|
GenerateOk {
|
2023-05-09 17:39:59 +00:00
|
|
|
msg_id: u64,
|
|
|
|
|
in_reply_to: u64,
|
2023-05-11 19:18:01 +00:00
|
|
|
id: Uuid,
|
2023-05-09 17:39:59 +00:00
|
|
|
},
|
|
|
|
|
#[serde(rename = "error")]
|
|
|
|
|
Error {
|
|
|
|
|
in_reply_to: u64,
|
|
|
|
|
code: u64,
|
|
|
|
|
text: String,
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
|
let stdin = io::stdin();
|
|
|
|
|
let mut stdout = io::stdout();
|
|
|
|
|
let mut node_id = String::new();
|
|
|
|
|
|
|
|
|
|
for line in stdin.lock().lines() {
|
|
|
|
|
let input: Message = serde_json::from_str(&line.unwrap()).unwrap();
|
|
|
|
|
match input.body {
|
|
|
|
|
Body::Init {
|
|
|
|
|
msg_id,
|
|
|
|
|
node_id: id,
|
|
|
|
|
..
|
|
|
|
|
} => {
|
|
|
|
|
node_id = id;
|
|
|
|
|
let output = Message {
|
|
|
|
|
src: node_id.clone(),
|
|
|
|
|
dest: input.src,
|
|
|
|
|
body: Body::InitOk {
|
|
|
|
|
in_reply_to: msg_id,
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
let output_json = serde_json::to_string(&output).unwrap();
|
|
|
|
|
writeln!(stdout, "{}", output_json).unwrap();
|
|
|
|
|
stdout.flush().unwrap();
|
|
|
|
|
}
|
2023-05-11 19:18:01 +00:00
|
|
|
Body::Generate { msg_id, .. } => {
|
|
|
|
|
let uuid = uuid7::uuid7();
|
2023-05-09 17:39:59 +00:00
|
|
|
let output = Message {
|
|
|
|
|
src: node_id.clone(),
|
|
|
|
|
dest: input.src,
|
2023-05-11 19:18:01 +00:00
|
|
|
body: Body::GenerateOk {
|
2023-05-09 17:39:59 +00:00
|
|
|
msg_id,
|
|
|
|
|
in_reply_to: msg_id,
|
2023-05-11 19:18:01 +00:00
|
|
|
id: uuid,
|
2023-05-09 17:39:59 +00:00
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
let output_json = serde_json::to_string(&output).unwrap();
|
|
|
|
|
writeln!(stdout, "{}", output_json).unwrap();
|
|
|
|
|
stdout.flush().unwrap();
|
|
|
|
|
}
|
|
|
|
|
Body::Error {
|
|
|
|
|
in_reply_to,
|
|
|
|
|
code,
|
|
|
|
|
text,
|
|
|
|
|
} => {
|
|
|
|
|
eprintln!(
|
|
|
|
|
"Error received (in_reply_to: {}, code: {}, text: {})",
|
|
|
|
|
in_reply_to, code, text
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
_ => (),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|