mirror of
https://github.com/szymon-jozef/checkers.git
synced 2026-10-27 19:20:44 +01:00
feat: add message serialization
This commit is contained in:
118
Cargo.lock
generated
118
Cargo.lock
generated
@@ -8,6 +8,7 @@ version = "0.0.1"
|
||||
dependencies = [
|
||||
"env_logger",
|
||||
"log",
|
||||
"postcard",
|
||||
"rand",
|
||||
"serde",
|
||||
"uuid",
|
||||
@@ -78,6 +79,15 @@ version = "1.0.102"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
|
||||
|
||||
[[package]]
|
||||
name = "atomic-polyfill"
|
||||
version = "1.0.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4"
|
||||
dependencies = [
|
||||
"critical-section",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "1.3.2"
|
||||
@@ -96,6 +106,12 @@ version = "3.20.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
|
||||
|
||||
[[package]]
|
||||
name = "byteorder"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
version = "1.0.4"
|
||||
@@ -113,6 +129,15 @@ dependencies = [
|
||||
"rand_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cobs"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1"
|
||||
dependencies = [
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "colorchoice"
|
||||
version = "1.0.5"
|
||||
@@ -128,6 +153,12 @@ dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "critical-section"
|
||||
version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b"
|
||||
|
||||
[[package]]
|
||||
name = "defmt"
|
||||
version = "1.1.1"
|
||||
@@ -159,6 +190,18 @@ dependencies = [
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "embedded-io"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced"
|
||||
|
||||
[[package]]
|
||||
name = "embedded-io"
|
||||
version = "0.6.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d"
|
||||
|
||||
[[package]]
|
||||
name = "env_filter"
|
||||
version = "2.0.0"
|
||||
@@ -232,6 +275,15 @@ dependencies = [
|
||||
"wasip3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hash32"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67"
|
||||
dependencies = [
|
||||
"byteorder",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.15.5"
|
||||
@@ -247,6 +299,20 @@ version = "0.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
|
||||
|
||||
[[package]]
|
||||
name = "heapless"
|
||||
version = "0.7.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f"
|
||||
dependencies = [
|
||||
"atomic-polyfill",
|
||||
"hash32",
|
||||
"rustc_version",
|
||||
"serde",
|
||||
"spin",
|
||||
"stable_deref_trait",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "heck"
|
||||
version = "0.5.0"
|
||||
@@ -342,6 +408,15 @@ version = "0.2.189"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2"
|
||||
|
||||
[[package]]
|
||||
name = "lock_api"
|
||||
version = "0.4.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
|
||||
dependencies = [
|
||||
"scopeguard",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.33"
|
||||
@@ -387,6 +462,19 @@ dependencies = [
|
||||
"portable-atomic",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "postcard"
|
||||
version = "1.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24"
|
||||
dependencies = [
|
||||
"cobs",
|
||||
"embedded-io 0.4.0",
|
||||
"embedded-io 0.6.1",
|
||||
"heapless",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "prettyplease"
|
||||
version = "0.2.37"
|
||||
@@ -467,12 +555,27 @@ version = "0.8.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
|
||||
|
||||
[[package]]
|
||||
name = "rustc_version"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
|
||||
dependencies = [
|
||||
"semver",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustversion"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
|
||||
|
||||
[[package]]
|
||||
name = "scopeguard"
|
||||
version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
||||
|
||||
[[package]]
|
||||
name = "semver"
|
||||
version = "1.0.28"
|
||||
@@ -528,6 +631,21 @@ version = "0.4.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
|
||||
|
||||
[[package]]
|
||||
name = "spin"
|
||||
version = "0.9.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e"
|
||||
dependencies = [
|
||||
"lock_api",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "stable_deref_trait"
|
||||
version = "1.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.119"
|
||||
|
||||
@@ -12,6 +12,7 @@ edition = "2024"
|
||||
[dependencies]
|
||||
env_logger = "0.11.11"
|
||||
log = "0.4.33"
|
||||
postcard = { version = "1.1.3", features = ["alloc"] }
|
||||
rand = "0.10.2"
|
||||
serde = { version = "1.0.229", features = ["derive"] }
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ use log::{debug, error, info, trace, warn};
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
|
||||
pub struct Board {
|
||||
board: Vec<Field>,
|
||||
pub size: usize,
|
||||
|
||||
@@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::logic::{board::pawn::Pawn, math::position::Position};
|
||||
|
||||
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
|
||||
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Clone)]
|
||||
pub struct Field {
|
||||
pub position: Position,
|
||||
pub pawn: Option<Pawn>,
|
||||
|
||||
@@ -3,7 +3,7 @@ use uuid::Uuid;
|
||||
|
||||
use crate::logic::{math::position::Position, player::Player};
|
||||
|
||||
#[derive(PartialEq, Eq, Debug, Serialize, Deserialize)]
|
||||
#[derive(PartialEq, Eq, Debug, Serialize, Deserialize, Clone)]
|
||||
pub enum PawnState {
|
||||
Man,
|
||||
Dame,
|
||||
@@ -11,7 +11,7 @@ pub enum PawnState {
|
||||
}
|
||||
|
||||
/// Basic pawn
|
||||
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
|
||||
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Clone)]
|
||||
pub struct Pawn {
|
||||
pub state: PawnState,
|
||||
pub owner: Uuid,
|
||||
@@ -26,6 +26,7 @@ impl Pawn {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, Clone)]
|
||||
pub struct CapturePath {
|
||||
pub from: Position,
|
||||
pub steps: Vec<Position>,
|
||||
@@ -40,7 +41,7 @@ impl CapturePath {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
#[derive(Debug, PartialEq, Eq, Deserialize, Serialize, Clone)]
|
||||
pub struct MovePath {
|
||||
pub from: Position,
|
||||
pub available_steps: Vec<Position>,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
use log::{info, warn};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::logic::{
|
||||
board::{
|
||||
@@ -9,6 +10,7 @@ use crate::logic::{
|
||||
player::Player,
|
||||
};
|
||||
|
||||
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, Clone)]
|
||||
pub enum GameResult {
|
||||
Lost(uuid::Uuid),
|
||||
Draw,
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
use serde::{Deserialize, Serialize, de::DeserializeOwned};
|
||||
use uuid::Uuid;
|
||||
|
||||
use crate::logic::{
|
||||
@@ -9,6 +10,29 @@ use crate::logic::{
|
||||
math::position::Position,
|
||||
};
|
||||
|
||||
use postcard::{from_bytes, to_allocvec};
|
||||
|
||||
pub trait MessageLike {
|
||||
fn to_bits(&self) -> Result<Vec<u8>, postcard::Error>;
|
||||
fn from_bits(bits: &[u8]) -> Result<Self, postcard::Error>
|
||||
where
|
||||
Self: Sized;
|
||||
}
|
||||
|
||||
impl<T> MessageLike for T
|
||||
where
|
||||
T: DeserializeOwned + Serialize,
|
||||
{
|
||||
fn to_bits(&self) -> Result<Vec<u8>, postcard::Error> {
|
||||
to_allocvec(self)
|
||||
}
|
||||
|
||||
fn from_bits(bits: &[u8]) -> Result<Self, postcard::Error> {
|
||||
from_bytes(bits)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, Clone)]
|
||||
pub enum ServerMessage {
|
||||
RequestHandshake,
|
||||
AcceptHandshake { player_id: Uuid },
|
||||
@@ -23,9 +47,78 @@ pub enum ServerMessage {
|
||||
GameEnd { result: GameResult },
|
||||
}
|
||||
|
||||
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, Clone)]
|
||||
pub enum ClientMessage {
|
||||
AnswerHandshake { player_name: String },
|
||||
|
||||
RequestCapture { capture_path: CapturePath },
|
||||
RequestMove { from: Position, to: Position },
|
||||
}
|
||||
|
||||
pub struct Message<T>
|
||||
where
|
||||
T: MessageLike,
|
||||
{
|
||||
pub size: u32,
|
||||
pub content: T,
|
||||
}
|
||||
|
||||
impl<T> Message<T>
|
||||
where
|
||||
T: MessageLike,
|
||||
{
|
||||
pub fn new(content: T) -> Result<Message<T>, postcard::Error> {
|
||||
let size: usize = content.to_bits()?.len();
|
||||
|
||||
Ok(Message {
|
||||
size: size as u32,
|
||||
content,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_server_message_serde() {
|
||||
let server_msg_content: ServerMessage = ServerMessage::RequestHandshake;
|
||||
let msg: Message<ServerMessage> =
|
||||
Message::new(server_msg_content.clone()).expect("Couldn't serialize message");
|
||||
|
||||
assert_eq!(1, msg.size);
|
||||
|
||||
let bits = msg
|
||||
.content
|
||||
.to_bits()
|
||||
.expect("Could not convert message content to bits!");
|
||||
|
||||
let recovered_message: ServerMessage =
|
||||
MessageLike::from_bits(&bits).expect("Could not recover the message");
|
||||
|
||||
assert_eq!(recovered_message, server_msg_content);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_client_message_serde() {
|
||||
let from: Position = Position { row: 0, column: 0 };
|
||||
let to: Position = Position { row: 1, column: 1 };
|
||||
|
||||
let client_msg_content: ClientMessage = ClientMessage::RequestMove { from, to };
|
||||
|
||||
let msg = Message::new(client_msg_content.clone()).expect("Could not serialize message");
|
||||
|
||||
assert_eq!(5, msg.size);
|
||||
|
||||
let bits = msg
|
||||
.content
|
||||
.to_bits()
|
||||
.expect("Could not convert the message into bits!");
|
||||
|
||||
let recovered_message: ClientMessage =
|
||||
MessageLike::from_bits(&bits).expect("Could not recover the message!");
|
||||
|
||||
assert_eq!(recovered_message, client_msg_content);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user