From 90318f6c476921becb36d153d68d4024309f8b2c Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 13 Jun 2026 17:58:11 -0400 Subject: [PATCH] Adding macro to serialize --- src/token/mod.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/token/mod.rs b/src/token/mod.rs index 2f713d8..e2fbf9b 100644 --- a/src/token/mod.rs +++ b/src/token/mod.rs @@ -7,11 +7,32 @@ pub struct Claims { #[serde(alias = "iss")] pub issued: String, #[serde(alias = "exp")] + #[serde(deserialize_with = "deserialize_i64_from_f64")] pub expired: i64, #[serde(alias = "iat")] + #[serde(deserialize_with = "deserialize_i64_from_f64")] pub issued_at: i64, } +fn deserialize_i64_from_f64<'de, D>(deserializer: D) -> Result +where + D: serde::Deserializer<'de>, +{ + let val = f64::deserialize(deserializer)?; + // Handle NaN and infinity cases + if val.is_nan() || val.is_infinite() { + return Err(serde::de::Error::custom("invalid float value")); + } + // Round to nearest integer and convert + let rounded = val.round(); + // Check if the rounded value can fit in i64 + if rounded < (i64::MIN as f64) || rounded > (i64::MAX as f64) { + Err(serde::de::Error::custom("float out of i64 range")) + } else { + Ok(rounded as i64) + } +} + #[derive(Clone, Debug, Default, Deserialize, Serialize, utoipa::ToSchema)] pub struct LoginResult { pub user_id: uuid::Uuid,