From 104db04d9d80d69b0359cbfde6a7b4c78ef51531 Mon Sep 17 00:00:00 2001 From: Mingwei Samuel Date: Mon, 20 Jun 2022 09:40:28 -0700 Subject: [PATCH] Revert "Remove serde_string! macro in favor of #[derive(Serialize, Deserialize)]" This reverts commit 038e5eb4931c8a58c3acc697831fa32dd50c2d3e. This is to fix handling of `#[strum(default)]` variants. --- riven/src/consts/division.rs | 4 ++-- riven/src/consts/game_mode.rs | 3 +-- riven/src/consts/game_type.rs | 4 ++-- riven/src/consts/macros.rs | 23 +++++++++++++++++++++++ riven/src/consts/queue_type.rs | 4 ++-- riven/src/consts/tier.rs | 6 +++--- riven/srcgen/consts/game_mode.rs.dt | 3 +-- riven/srcgen/consts/game_type.rs.dt | 4 ++-- 8 files changed, 36 insertions(+), 15 deletions(-) diff --git a/riven/src/consts/division.rs b/riven/src/consts/division.rs index 5d38135..0f7238b 100644 --- a/riven/src/consts/division.rs +++ b/riven/src/consts/division.rs @@ -1,7 +1,6 @@ use std::cmp::Ordering; use num_enum::{ IntoPrimitive, TryFromPrimitive }; -use serde::{ Serialize, Deserialize }; use strum::IntoEnumIterator; use strum_macros::{ EnumString, Display, AsRefStr, IntoStaticStr }; @@ -16,7 +15,6 @@ use strum_macros::{ EnumString, Display, AsRefStr, IntoStaticStr }; #[derive(Eq, PartialEq, Hash)] #[derive(EnumString, Display, AsRefStr, IntoStaticStr)] #[derive(IntoPrimitive, TryFromPrimitive)] -#[derive(Serialize, Deserialize)] #[repr(u8)] pub enum Division { /// Division 1, the best/highest division in a [`Tier`](crate::consts::Tier), or the only division in @@ -33,6 +31,8 @@ pub enum Division { V = 5, } +serde_string!(Division); + /// Returns a DoubleEndedIterator of I, II, III, IV. /// Ordered from high rank (I) to low (IV). /// Excludes V, which is deprecated. diff --git a/riven/src/consts/game_mode.rs b/riven/src/consts/game_mode.rs index 122dc21..b40ae97 100644 --- a/riven/src/consts/game_mode.rs +++ b/riven/src/consts/game_mode.rs @@ -6,7 +6,6 @@ // // /////////////////////////////////////////////// -use serde::{ Serialize, Deserialize }; use strum_macros::{ EnumString, IntoStaticStr }; /// League of Legends game mode, such as Classic, @@ -15,7 +14,6 @@ use strum_macros::{ EnumString, IntoStaticStr }; #[derive(Debug, Clone)] #[derive(Eq, PartialEq, Hash)] #[derive(EnumString, IntoStaticStr)] -#[derive(Serialize, Deserialize)] #[repr(u8)] pub enum GameMode { /// Catch-all variant for new, unknown game modes. @@ -73,3 +71,4 @@ pub enum GameMode { } string_enum_str!(GameMode); +serde_string!(GameMode); diff --git a/riven/src/consts/game_type.rs b/riven/src/consts/game_type.rs index cf24bdb..df63b65 100644 --- a/riven/src/consts/game_type.rs +++ b/riven/src/consts/game_type.rs @@ -6,14 +6,12 @@ // // /////////////////////////////////////////////// -use serde::{ Serialize, Deserialize }; use strum_macros::{ EnumString, Display, AsRefStr, IntoStaticStr }; /// League of Legends game type: matched game, custom game, or tutorial game. #[derive(Debug, Copy, Clone)] #[derive(Eq, PartialEq, Hash)] #[derive(EnumString, Display, AsRefStr, IntoStaticStr)] -#[derive(Serialize, Deserialize)] #[repr(u8)] pub enum GameType { /// Custom games @@ -23,3 +21,5 @@ pub enum GameType { /// Tutorial games TUTORIAL_GAME, } + +serde_string!(GameType); diff --git a/riven/src/consts/macros.rs b/riven/src/consts/macros.rs index 1122beb..14f7892 100644 --- a/riven/src/consts/macros.rs +++ b/riven/src/consts/macros.rs @@ -1,5 +1,28 @@ #![macro_use] +macro_rules! serde_string { + ( $name:ident ) => { + impl<'de> serde::de::Deserialize<'de> for $name { + fn deserialize(deserializer: D) -> Result + where + D: serde::de::Deserializer<'de> + { + let s = String::deserialize(deserializer)?; + s.parse().map_err(serde::de::Error::custom) + } + } + + impl serde::ser::Serialize for $name { + fn serialize(&self, serializer: S) -> Result + where + S: serde::ser::Serializer, + { + serializer.serialize_str(self.as_ref()) + } + } + }; +} + macro_rules! string_enum_str { ( $name:ident ) => { impl AsRef for $name { diff --git a/riven/src/consts/queue_type.rs b/riven/src/consts/queue_type.rs index e353b3b..3094228 100644 --- a/riven/src/consts/queue_type.rs +++ b/riven/src/consts/queue_type.rs @@ -1,4 +1,3 @@ -use serde::{ Serialize, Deserialize }; use strum_macros::{ EnumString, Display, AsRefStr, IntoStaticStr }; /// LoL or TFT ranked queue types. @@ -6,7 +5,6 @@ use strum_macros::{ EnumString, Display, AsRefStr, IntoStaticStr }; #[derive(Debug, Clone)] #[derive(Eq, PartialEq, Hash)] #[derive(EnumString, Display, AsRefStr, IntoStaticStr)] -#[derive(Serialize, Deserialize)] pub enum QueueType { /// Catch-all variant for new, unknown queue types. #[strum(default)] @@ -30,6 +28,8 @@ pub enum QueueType { RANKED_TFT_PAIRS, } +serde_string!(QueueType); + #[cfg(test)] mod test { use super::*; diff --git a/riven/src/consts/tier.rs b/riven/src/consts/tier.rs index 703c12c..deb8ad7 100644 --- a/riven/src/consts/tier.rs +++ b/riven/src/consts/tier.rs @@ -1,6 +1,5 @@ -use num_enum::{ IntoPrimitive, TryFromPrimitive }; -use serde::{ Serialize, Deserialize }; use strum::IntoEnumIterator; +use num_enum::{ IntoPrimitive, TryFromPrimitive }; use strum_macros::{ EnumString, Display, AsRefStr, IntoStaticStr }; /// LoL and TFT ranked tiers, such as gold, diamond, challenger, etc. @@ -14,7 +13,6 @@ use strum_macros::{ EnumString, Display, AsRefStr, IntoStaticStr }; #[derive(Eq, PartialEq, Hash, PartialOrd, Ord)] #[derive(IntoPrimitive, TryFromPrimitive)] #[derive(EnumString, Display, AsRefStr, IntoStaticStr)] -#[derive(Serialize, Deserialize)] #[repr(u8)] pub enum Tier { /// Challenger, the highest tier, an apex tier. Repr: `220_u8`. @@ -42,6 +40,8 @@ pub enum Tier { UNRANKED = 0, } +serde_string!(Tier); + impl Tier { /// If this tier is an apex tier: [`Self::MASTER`], [`Self::GRANDMASTER`], /// or [`Self::CHALLENGER`]. Returns false for [`Self::UNRANKED`]. diff --git a/riven/srcgen/consts/game_mode.rs.dt b/riven/srcgen/consts/game_mode.rs.dt index 16063fb..463402a 100644 --- a/riven/srcgen/consts/game_mode.rs.dt +++ b/riven/srcgen/consts/game_mode.rs.dt @@ -3,7 +3,6 @@ const gameModes = require('./.gameModes.json'); }}{{= dotUtils.preamble() }} -use serde::{ Serialize, Deserialize }; use strum_macros::{ EnumString, IntoStaticStr }; /// League of Legends game mode, such as Classic, @@ -12,7 +11,6 @@ use strum_macros::{ EnumString, IntoStaticStr }; #[derive(Debug, Clone)] #[derive(Eq, PartialEq, Hash)] #[derive(EnumString, IntoStaticStr)] -#[derive(Serialize, Deserialize)] #[repr(u8)] pub enum GameMode { /// Catch-all variant for new, unknown game modes. @@ -33,3 +31,4 @@ pub enum GameMode { } string_enum_str!(GameMode); +serde_string!(GameMode); diff --git a/riven/srcgen/consts/game_type.rs.dt b/riven/srcgen/consts/game_type.rs.dt index 4ac61e3..5668453 100644 --- a/riven/srcgen/consts/game_type.rs.dt +++ b/riven/srcgen/consts/game_type.rs.dt @@ -3,14 +3,12 @@ const gameTypes = require('./.gameTypes.json'); }}{{= dotUtils.preamble() }} -use serde::{ Serialize, Deserialize }; use strum_macros::{ EnumString, Display, AsRefStr, IntoStaticStr }; /// League of Legends game type: matched game, custom game, or tutorial game. #[derive(Debug, Copy, Clone)] #[derive(Eq, PartialEq, Hash)] #[derive(EnumString, Display, AsRefStr, IntoStaticStr)] -#[derive(Serialize, Deserialize)] #[repr(u8)] pub enum GameType { {{ @@ -25,3 +23,5 @@ pub enum GameType { } }} } + +serde_string!(GameType);