diff --git a/Cargo.lock b/Cargo.lock index 31ee483..1e3ab74 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -235,9 +235,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "axum" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504e3947307ac8326a5437504c517c4b56716c9d98fac0028c2acc7ca47d70ae" +checksum = "49c41b948da08fb481a94546cd874843adc1142278b0af4badf9b1b78599d68d" dependencies = [ "async-trait", "axum-core", @@ -810,6 +810,16 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "event-listener" version = "5.3.1" @@ -837,6 +847,18 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1" +[[package]] +name = "fastrand" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + [[package]] name = "flate2" version = "1.0.35" @@ -1118,6 +1140,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.3.9" @@ -1894,6 +1922,8 @@ name = "lib" version = "0.1.0" dependencies = [ "anyhow", + "prost", + "prost-build", "rand", "serde", "tracing", @@ -1911,6 +1941,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfae20f6b19ad527b550c223fddc3077a547fc70cda94b9b566575423fd303ee" +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + [[package]] name = "litemap" version = "0.7.3" @@ -2030,6 +2066,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "multimap" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" + [[package]] name = "next_tuple" version = "0.1.0-rc1" @@ -2197,6 +2239,16 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap 2.6.0", +] + [[package]] name = "phf" version = "0.11.2" @@ -2407,6 +2459,27 @@ dependencies = [ "prost-derive", ] +[[package]] +name = "prost-build" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c1318b19085f08681016926435853bbf7858f9c082d0999b80550ff5d9abe15" +dependencies = [ + "bytes", + "heck", + "itertools", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn", + "tempfile", +] + [[package]] name = "prost-derive" version = "0.13.3" @@ -2643,6 +2716,19 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" +[[package]] +name = "rustix" +version = "0.38.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99e4ea3e1cdc4b559b8e5650f9c8e5998e3e5c1343b4eaf034565f32318d63c0" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + [[package]] name = "rustversion" version = "1.0.18" @@ -3020,6 +3106,19 @@ dependencies = [ "web-sys", ] +[[package]] +name = "tempfile" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +dependencies = [ + "cfg-if", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + [[package]] name = "thaw" version = "0.4.0-beta4" diff --git a/lib/Cargo.toml b/lib/Cargo.toml index 6da2bc2..718e54d 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -5,6 +5,10 @@ edition = "2021" [dependencies] anyhow = "1.0.86" +prost = "0" rand = "0.8.5" serde = "1.0.204" tracing = "0.1.40" + +[build-dependencies] +prost-build = "0" diff --git a/lib/src/lib.rs b/lib/src/lib.rs index 03e9f8a..b21813a 100644 --- a/lib/src/lib.rs +++ b/lib/src/lib.rs @@ -1,65 +1,94 @@ +use prost::Message; use serde::{Deserialize, Serialize}; use std::collections::HashSet; /// Judge decision -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive(Clone, Serialize, Deserialize, Message)] pub struct JudgeDecisionRequest { + #[prost(string, tag = "1")] pub game_id: String, + #[prost(string, repeated, tag = "2")] pub winning_cards: Vec, } +/// White Card Meta +#[derive(Clone, Message, Hash, Eq, PartialEq, Serialize, Deserialize)] +pub struct WhiteCardMeta { + #[prost(string, tag = "1")] + pub uuid: String, + #[prost(string, tag = "2")] + pub text: String, +} + +/// Judge entry +#[derive(Clone, Message, Serialize, Deserialize)] +pub struct JudgeEntry { + #[prost(message, repeated, tag = "1")] + pub cards_to_judge: Vec, +} + /// Judge round -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive(Clone, Message, Serialize, Deserialize)] pub struct JudgeRound { - pub cards_to_judge: Vec>, + #[prost(message, repeated, tag = "1")] + pub entries: Vec, } /// Delete game request -#[derive(Debug, Serialize, Deserialize)] +#[derive(Message, Serialize, Deserialize)] pub struct GameDeleteRequest { + #[prost(string, tag = "1")] pub delete_game_id: String, } /// Game join request -#[derive(Debug, Serialize, Deserialize)] +#[derive(Message, Serialize, Deserialize)] pub struct GameJoinRequest { + #[prost(string, tag = "1")] pub id: String, } /// Player Move Request -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive(Clone, Message, Serialize, Deserialize)] pub struct PlayerMoveRequest { + #[prost(string, tag = "1")] pub game_id: String, + #[prost(string, repeated, tag = "2")] pub card_ids: Vec, } -/// White Card Meta -#[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize, Deserialize)] -pub struct WhiteCardMeta { - pub uuid: String, - pub text: String, -} - /// Game Player Meta -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive(Clone, Message, Serialize, Deserialize)] pub struct GamePlayerMeta { + #[prost(string, tag = "1")] pub name: String, - pub score: usize, + #[prost(uint32, tag = "2")] + pub score: u32, + #[prost(bool, tag = "3")] pub submitted: bool, } /// Game meta -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive(Clone, Message, Serialize, Deserialize)] pub struct GameMeta { + #[prost(string, tag = "1")] pub uuid: String, + #[prost(string, tag = "2")] pub name: String, + #[prost(string, tag = "3")] pub host: String, + #[prost(message, repeated, tag = "4")] pub players: Vec, + #[prost(string, tag = "5")] pub czar: String, + #[prost(bytes, tag = "6")] pub packs: Vec, - pub white_count: usize, - pub black_count: usize, - pub white_discard_count: usize, + #[prost(uint32, tag = "7")] + pub white_count: u32, + #[prost(uint32, tag = "8")] + pub black_count: u32, + #[prost(uint32, tag = "9")] + pub white_discard_count: u32, } /// Game state meta diff --git a/server/src/game.rs b/server/src/game.rs index 626b782..e4e1926 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -208,24 +208,26 @@ impl Game { } Ok(Some(( JudgeRound { - cards_to_judge: self + entries: self .judge_pile_meta .keys() .into_iter() .map(|group| { - group - .iter() - .map(|id| { - let card = self.judge_pile.get(id).unwrap().clone(); - // TODO: Make sure card exists - WhiteCardMeta { - uuid: card.uuid.to_string(), - text: card.text.clone(), - } - }) - .collect() + JudgeEntry { + cards_to_judge: group + .iter() + .map(|id| { + let card = self.judge_pile.get(id).unwrap().clone(); + // TODO: Make sure card exists + WhiteCardMeta { + uuid: card.uuid.to_string(), + text: card.text.clone(), + } + }) + .collect(), + } }) - .collect(), + .collect::>(), }, self.czar.read().unwrap().uuid.clone(), ))) diff --git a/server/src/game_handler.rs b/server/src/game_handler.rs index 2673b29..5517525 100644 --- a/server/src/game_handler.rs +++ b/server/src/game_handler.rs @@ -202,7 +202,7 @@ impl GameHandler { .values() .map(|player| GamePlayerMeta { name: player.user.read().unwrap().name.clone(), - score: player.black.len(), + score: player.black.len().try_into().unwrap(), submitted: this_game .judge_pile_meta .values() @@ -220,9 +220,9 @@ impl GameHandler { players: players.clone(), czar: this_game.czar.read().unwrap().name.clone(), packs: this_game.packs.clone(), - white_count: this_game.white.len(), - black_count: this_game.black.len(), - white_discard_count: this_game.white_discard.len(), + white_count: this_game.white.len().try_into().unwrap(), + black_count: this_game.black.len().try_into().unwrap(), + white_discard_count: this_game.white_discard.len().try_into().unwrap(), }; // Send user's update