diff options
author | metamuffin <metamuffin@disroot.org> | 2025-03-23 21:34:08 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-03-23 21:34:10 +0100 |
commit | bf0803bf99c988d160a4573a38ba2e5c1b16a905 (patch) | |
tree | c7f4169d6ddb6ee31e173697a455487d226ce685 /server | |
parent | e4b93aad5c863a171663a02ae979fe3a2a114f4e (diff) | |
download | hurrycurry-bf0803bf99c988d160a4573a38ba2e5c1b16a905.tar hurrycurry-bf0803bf99c988d160a4573a38ba2e5c1b16a905.tar.bz2 hurrycurry-bf0803bf99c988d160a4573a38ba2e5c1b16a905.tar.zst |
fix serde_json parsing integers in float notation
Diffstat (limited to 'server')
-rw-r--r-- | server/protocol/src/lib.rs | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/server/protocol/src/lib.rs b/server/protocol/src/lib.rs index 74d463a1..552c4eed 100644 --- a/server/protocol/src/lib.rs +++ b/server/protocol/src/lib.rs @@ -20,7 +20,7 @@ use bincode::{ Decode, Encode, }; use glam::{IVec2, Vec2}; -use serde::{Deserialize, Serialize}; +use serde::{Deserialize, Deserializer, Serialize}; use std::{collections::HashSet, sync::LazyLock}; pub use glam; @@ -48,32 +48,32 @@ pub const BINCODE_CONFIG: Configuration<LittleEndian, Varint, Limit<4096>> = Debug, Clone, Copy, Serialize, Deserialize, Encode, Decode, PartialEq, Eq, PartialOrd, Ord, Hash, )] #[serde(transparent)] -pub struct PlayerID(pub i64); +pub struct PlayerID(#[serde(deserialize_with = "deser_i64")] pub i64); #[derive( Debug, Clone, Copy, Serialize, Deserialize, Encode, Decode, PartialEq, Eq, PartialOrd, Ord, Hash, )] #[serde(transparent)] -pub struct ItemIndex(pub usize); +pub struct ItemIndex(#[serde(deserialize_with = "deser_usize")] pub usize); #[derive( Debug, Clone, Copy, Serialize, Deserialize, Encode, Decode, PartialEq, Eq, PartialOrd, Ord, Hash, )] #[serde(transparent)] -pub struct TileIndex(pub usize); +pub struct TileIndex(#[serde(deserialize_with = "deser_usize")] pub usize); #[derive( Debug, Clone, Copy, Serialize, Deserialize, Encode, Decode, PartialEq, Eq, PartialOrd, Ord, Hash, )] #[serde(transparent)] -pub struct RecipeIndex(pub usize); +pub struct RecipeIndex(#[serde(deserialize_with = "deser_usize")] pub usize); #[derive( Debug, Clone, Copy, Serialize, Deserialize, Encode, Decode, PartialEq, Eq, PartialOrd, Ord, Hash, )] #[serde(transparent)] -pub struct DemandIndex(pub usize); +pub struct DemandIndex(#[serde(deserialize_with = "deser_usize")] pub usize); #[derive(Debug, Clone, Copy, Serialize, Deserialize, Encode, Decode, PartialEq, Eq, Hash)] #[serde(transparent)] -pub struct Hand(pub usize); +pub struct Hand(#[serde(deserialize_with = "deser_usize")] pub usize); #[derive(Debug, Clone, Serialize, Deserialize, Encode, Decode)] pub struct MapMetadata { @@ -110,6 +110,7 @@ pub struct Gamedata { pub enum PacketS { Join { name: String, + #[serde(deserialize_with = "deser_i32")] character: i32, #[serde(default = "chef_class")] class: PlayerClass, @@ -130,6 +131,7 @@ pub enum PacketS { Interact { player: PlayerID, hand: Hand, + #[serde(deserialize_with = "deser_ivec2_opt")] #[bincode(with_serde)] pos: Option<IVec2>, }, @@ -420,3 +422,20 @@ pub enum DocumentAlign { FlowEnd, Bottom, } + +fn deser_i64<'de, D: Deserializer<'de>>(deserializer: D) -> Result<i64, D::Error> { + let x = f64::deserialize(deserializer)?; + Ok(x.trunc() as i64) +} +fn deser_i32<'de, D: Deserializer<'de>>(deserializer: D) -> Result<i32, D::Error> { + let x = f64::deserialize(deserializer)?; + Ok(x.trunc() as i32) +} +fn deser_usize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<usize, D::Error> { + let x = f64::deserialize(deserializer)?; + Ok(x.trunc() as usize) +} +fn deser_ivec2_opt<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Option<IVec2>, D::Error> { + let x = Option::<Vec2>::deserialize(deserializer)?; + Ok(x.map(|v| v.as_ivec2())) +} |