Add unknown variant to GameMode

This commit is contained in:
Mingwei Samuel 2021-06-30 19:35:08 -07:00
parent 5daeab990a
commit 88124ecb3a
3 changed files with 38 additions and 8 deletions

View file

@ -6,16 +6,20 @@
// // // //
/////////////////////////////////////////////// ///////////////////////////////////////////////
use strum_macros::{ EnumString, Display, AsRefStr, IntoStaticStr }; use strum_macros::{ EnumString, IntoStaticStr };
/// League of Legends game mode, such as Classic, /// League of Legends game mode, such as Classic,
/// ARAM, URF, One For All, Ascension, etc. /// ARAM, URF, One For All, Ascension, etc.
#[non_exhaustive] #[non_exhaustive]
#[derive(Debug, Copy, Clone)] #[derive(Debug, Clone)]
#[derive(Eq, PartialEq, Hash)] #[derive(Eq, PartialEq, Hash)]
#[derive(EnumString, Display, AsRefStr, IntoStaticStr)] #[derive(EnumString, IntoStaticStr)]
#[repr(u8)] #[repr(u8)]
pub enum GameMode { pub enum GameMode {
// Catch-all variant for new, unknown game modes.
#[strum(default)]
UNKNOWN(String),
/// ARAM games /// ARAM games
ARAM, ARAM,
/// All Random Summoner's Rift games /// All Random Summoner's Rift games
@ -62,4 +66,5 @@ pub enum GameMode {
URF, URF,
} }
string_enum_str!(GameMode);
serde_string!(GameMode); serde_string!(GameMode);

View file

@ -11,6 +11,7 @@ macro_rules! serde_string {
s.parse().map_err(serde::de::Error::custom) s.parse().map_err(serde::de::Error::custom)
} }
} }
impl serde::ser::Serialize for $name { impl serde::ser::Serialize for $name {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where where
@ -22,6 +23,25 @@ macro_rules! serde_string {
}; };
} }
macro_rules! string_enum_str {
( $name:ident ) => {
impl AsRef<str> for $name {
fn as_ref(&self) -> &str {
match self {
Self::UNKNOWN(string) => &*string,
known => known.into(),
}
}
}
impl std::fmt::Display for $name {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
self.as_ref().fmt(f)
}
}
}
}
macro_rules! arr { macro_rules! arr {
( (
$( #[$attr:meta] )* $( #[$attr:meta] )*
@ -35,7 +55,7 @@ macro_rules! arr {
macro_rules! newtype_enum { macro_rules! newtype_enum {
{ {
$( #[$attr:meta] )* $( #[$attr:meta] )*
$v:vis newtype_enum $name:ident($repr:ident) { $v:vis newtype_enum $name:ident($repr:ty) {
$( $(
$( #[$var_attr:meta] )* $( #[$var_attr:meta] )*
$var_name:ident = $var_val:expr, $var_name:ident = $var_val:expr,
@ -50,7 +70,7 @@ macro_rules! newtype_enum {
impl $name { impl $name {
$( $(
$( #[$var_attr] )* $( #[$var_attr] )*
$v const $var_name: Self = Self( $var_val ); $v const $var_name: Self = Self($var_val);
)* )*
} }

View file

@ -3,16 +3,20 @@
const gameModes = require('./.gameModes.json'); const gameModes = require('./.gameModes.json');
}}{{= dotUtils.preamble() }} }}{{= dotUtils.preamble() }}
use strum_macros::{ EnumString, Display, AsRefStr, IntoStaticStr }; use strum_macros::{ EnumString, IntoStaticStr };
/// League of Legends game mode, such as Classic, /// League of Legends game mode, such as Classic,
/// ARAM, URF, One For All, Ascension, etc. /// ARAM, URF, One For All, Ascension, etc.
#[non_exhaustive] #[non_exhaustive]
#[derive(Debug, Copy, Clone)] #[derive(Debug, Clone)]
#[derive(Eq, PartialEq, Hash)] #[derive(Eq, PartialEq, Hash)]
#[derive(EnumString, Display, AsRefStr, IntoStaticStr)] #[derive(EnumString, IntoStaticStr)]
#[repr(u8)] #[repr(u8)]
pub enum GameMode { pub enum GameMode {
// Catch-all variant for new, unknown game modes.
#[strum(default)]
UNKNOWN(String),
{{ {{
for (const e of gameModes) { for (const e of gameModes) {
const desc = e['x-desc'] ? e['x-desc'].split('\n') : []; const desc = e['x-desc'] ? e['x-desc'].split('\n') : [];
@ -26,4 +30,5 @@ pub enum GameMode {
}} }}
} }
string_enum_str!(GameMode);
serde_string!(GameMode); serde_string!(GameMode);