2021-02-05 22:24:28 +01:00
|
|
|
extern crate serde;
|
|
|
|
|
extern crate serde_json;
|
|
|
|
|
|
|
|
|
|
use serde::{Deserialize, Serialize};
|
2021-03-02 19:35:12 +01:00
|
|
|
use crate::Bytes;
|
2021-02-05 22:24:28 +01:00
|
|
|
|
|
|
|
|
#[derive(Debug, Serialize, Deserialize)]
|
|
|
|
|
pub enum Message {
|
|
|
|
|
Error,
|
2021-03-21 00:19:09 +01:00
|
|
|
Hand { origin: String, version: u32, public: bool, #[serde(default)] rand: String },
|
2021-02-13 23:37:44 +01:00
|
|
|
Shake { origin: String, version: u32, ok: bool, height: u64 },
|
2021-03-02 19:35:12 +01:00
|
|
|
Ping { height: u64, hash: Bytes },
|
|
|
|
|
Pong { height: u64, hash: Bytes },
|
2021-02-05 22:24:28 +01:00
|
|
|
GetPeers,
|
2021-02-11 21:51:32 +01:00
|
|
|
Peers { peers: Vec<String> },
|
2021-02-05 22:24:28 +01:00
|
|
|
GetBlock { index: u64 },
|
|
|
|
|
Block { index: u64, block: String },
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Message {
|
|
|
|
|
pub fn from_bytes(bytes: Vec<u8>) -> Result<Self, ()> {
|
|
|
|
|
let text = String::from_utf8(bytes).unwrap_or(String::from("Error{}"));
|
|
|
|
|
match serde_json::from_str(&text) {
|
|
|
|
|
Ok(cmd) => Ok(cmd),
|
|
|
|
|
Err(_) => Err(())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-21 00:19:09 +01:00
|
|
|
pub fn hand(origin: &str, version: u32, public: bool, rand: &str) -> Self {
|
|
|
|
|
Message::Hand { origin: origin.to_owned(), version, public, rand: rand.to_owned() }
|
2021-02-05 22:24:28 +01:00
|
|
|
}
|
|
|
|
|
|
2021-02-13 23:37:44 +01:00
|
|
|
pub fn shake(origin: &str, version: u32, ok: bool, height: u64) -> Self {
|
|
|
|
|
Message::Shake { origin: origin.to_owned(), version, ok, height }
|
2021-02-05 22:24:28 +01:00
|
|
|
}
|
|
|
|
|
|
2021-03-02 19:35:12 +01:00
|
|
|
pub fn ping(height: u64, hash: Bytes) -> Self {
|
|
|
|
|
Message::Ping { height, hash }
|
2021-02-05 22:24:28 +01:00
|
|
|
}
|
|
|
|
|
|
2021-03-02 19:35:12 +01:00
|
|
|
pub fn pong(height: u64, hash: Bytes) -> Self {
|
|
|
|
|
Message::Pong { height, hash }
|
2021-02-05 22:24:28 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn block(height: u64, str: String) -> Self {
|
|
|
|
|
Message::Block { index: height, block: str }
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-03-21 00:19:09 +01:00
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
|
mod tests {
|
|
|
|
|
use crate::p2p::Message;
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
pub fn test_hand() {
|
|
|
|
|
assert!(serde_json::from_str::<Message>("\"Error\"").is_ok());
|
|
|
|
|
assert!(serde_json::from_str::<Message>("{\"Hand\":{\"origin\":\"\",\"version\":1,\"public\":false,\"rand\":\"123\"}}").is_ok());
|
|
|
|
|
assert!(serde_json::from_str::<Message>("{\"Hand\":{\"origin\":\"\",\"version\":1,\"public\":false}}").is_ok());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|