From bf0803bf99c988d160a4573a38ba2e5c1b16a905 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sun, 23 Mar 2025 21:34:08 +0100 Subject: fix serde_json parsing integers in float notation --- server/protocol/src/lib.rs | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) (limited to 'server/protocol/src') 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> = 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, }, @@ -420,3 +422,20 @@ pub enum DocumentAlign { FlowEnd, Bottom, } + +fn deser_i64<'de, D: Deserializer<'de>>(deserializer: D) -> Result { + let x = f64::deserialize(deserializer)?; + Ok(x.trunc() as i64) +} +fn deser_i32<'de, D: Deserializer<'de>>(deserializer: D) -> Result { + let x = f64::deserialize(deserializer)?; + Ok(x.trunc() as i32) +} +fn deser_usize<'de, D: Deserializer<'de>>(deserializer: D) -> Result { + let x = f64::deserialize(deserializer)?; + Ok(x.trunc() as usize) +} +fn deser_ivec2_opt<'de, D: Deserializer<'de>>(deserializer: D) -> Result, D::Error> { + let x = Option::::deserialize(deserializer)?; + Ok(x.map(|v| v.as_ivec2())) +} -- cgit v1.2.3-70-g09d2