From 08e276a558d9368fce1907452eb3304567e44b4f Mon Sep 17 00:00:00 2001 From: Mingwei Samuel Date: Sat, 7 Jan 2023 20:07:35 -0800 Subject: [PATCH] Generate region enums --- riven/src/consts/mod.rs | 3 + riven/src/consts/route.rs | 395 +++++++++++++------------------- riven/src/consts/route_ext.rs | 184 +++++++++++++++ riven/srcgen/consts/route.rs.dt | 142 ++++++++++++ riven/srcgen/index.js | 4 + 5 files changed, 498 insertions(+), 230 deletions(-) create mode 100644 riven/src/consts/route_ext.rs create mode 100644 riven/srcgen/consts/route.rs.dt diff --git a/riven/src/consts/mod.rs b/riven/src/consts/mod.rs index b2e5e5f..c53cc1e 100644 --- a/riven/src/consts/mod.rs +++ b/riven/src/consts/mod.rs @@ -34,6 +34,9 @@ pub mod ranks; mod route; pub use route::*; +mod route_ext; +pub use route_ext::*; + mod season; pub use season::*; diff --git a/riven/src/consts/route.rs b/riven/src/consts/route.rs index fecda96..e7b9dd5 100644 --- a/riven/src/consts/route.rs +++ b/riven/src/consts/route.rs @@ -1,3 +1,11 @@ +/////////////////////////////////////////////// +// // +// ! // +// This file is automatically generated! // +// Do not directly edit! // +// // +/////////////////////////////////////////////// + use num_enum::{ IntoPrimitive, TryFromPrimitive }; use strum_macros::{ EnumString, EnumIter, Display, IntoStaticStr }; @@ -10,20 +18,40 @@ use strum_macros::{ EnumString, EnumIter, Display, IntoStaticStr }; #[repr(u8)] #[non_exhaustive] pub enum RegionalRoute { - /// Americas. + /// North and South America. + /// + /// `1` (riotapi-schema ID/repr) AMERICAS = 1, - /// Asia. + /// Asia, used for LoL matches (`match-v5`) and TFT matches (`tft-match-v1`). + /// + /// `2` (riotapi-schema ID/repr) ASIA = 2, /// Europe. + /// + /// `3` (riotapi-schema ID/repr) EUROPE = 3, - /// Southeast Asia. Only usable with the LoR endpoints. + /// South East Asia, used for LoR, LoL matches (`match-v5`), and TFT matches (`tft-match-v1`). + /// + /// `4` (riotapi-schema ID/repr) SEA = 4, + + /// Asia-Pacific, deprecated, for some old matches in `lor-match-v1`. + /// + /// `10` (riotapi-schema ID/repr) + #[deprecated] + APAC = 10, + + /// Special esports platform for `account-v1`. Do not confuse with the `esports` Valorant platform route. + /// + /// `11` (riotapi-schema ID/repr) + ESPORTS = 11, + } -/// Platform routes for League of Legends and Teamfight Tactics. +/// Platform routes for League of Legends (LoL), Teamfight Tactics (TFT), and Legends of Runeterra (LoR). #[derive(Debug)] #[derive(PartialEq, Eq, Hash, PartialOrd, Ord)] #[derive(IntoPrimitive, TryFromPrimitive)] @@ -34,91 +62,167 @@ pub enum RegionalRoute { // Note: strum(serialize = ...) actually specifies extra DEserialization values. pub enum PlatformRoute { /// Brazil. + /// + /// `16` (riotapi-schema ID/repr) #[strum(to_string="BR1", serialize="BR")] BR1 = 16, - /// North-east Europe. + /// Europe, Northeast. + /// + /// `17` (riotapi-schema ID/repr) #[strum(to_string="EUN1", serialize="EUNE")] EUN1 = 17, - /// West Europe. + /// Europe, West. + /// + /// `18` (riotapi-schema ID/repr) #[strum(to_string="EUW1", serialize="EUW")] EUW1 = 18, /// Japan. + /// + /// `19` (riotapi-schema ID/repr) #[strum(to_string="JP1", serialize="JP")] JP1 = 19, /// Korea. + /// + /// `20` (riotapi-schema ID/repr) KR = 20, - /// North Latin America. + /// Latin America, North. + /// + /// `21` (riotapi-schema ID/repr) #[strum(to_string="LA1", serialize="LAN")] LA1 = 21, - /// South Latin America. + /// Latin America, South. + /// + /// `22` (riotapi-schema ID/repr) #[strum(to_string="LA2", serialize="LAS")] LA2 = 22, /// North America. + /// + /// `23` (riotapi-schema ID/repr) #[strum(to_string="NA1", serialize="NA")] NA1 = 23, - /// Oceania. + /// Oceana. + /// + /// `24` (riotapi-schema ID/repr) #[strum(to_string="OC1", serialize="OCE")] OC1 = 24, - /// Russia. + /// Philippines + /// + /// `32` (riotapi-schema ID/repr) + PH2 = 32, + + /// Russia + /// + /// `25` (riotapi-schema ID/repr) RU = 25, - /// Turkey. + /// Singapore + /// + /// `33` (riotapi-schema ID/repr) + SG2 = 33, + + /// Thailand + /// + /// `34` (riotapi-schema ID/repr) + TH2 = 34, + + /// Turkey + /// + /// `26` (riotapi-schema ID/repr) #[strum(to_string="TR1", serialize="TR")] TR1 = 26, + /// Taiwan + /// + /// `35` (riotapi-schema ID/repr) + TW2 = 35, - /// Public beta environment. Only functional in certain endpoints. + /// Vietnam + /// + /// `36` (riotapi-schema ID/repr) + VN2 = 36, + + /// Public Beta Environment, special beta testing platform. Located in North America. + /// + /// `31` (riotapi-schema ID/repr) #[strum(to_string="PBE1", serialize="PBE")] PBE1 = 31, + } impl PlatformRoute { /// Converts this [`PlatformRoute`] into its corresponding - /// [`RegionalRoute`]. Useful, for example, in [`match-v5` endpoints](crate::endpoints::MatchV5). + /// [`RegionalRoute`] for LoL and TFT match endpoints. + /// For example, [`match-v5`](crate::endpoints::MatchV5). pub fn to_regional(self) -> RegionalRoute { match self { - Self::BR1 => RegionalRoute::AMERICAS, - Self::LA1 => RegionalRoute::AMERICAS, - Self::LA2 => RegionalRoute::AMERICAS, - Self::NA1 => RegionalRoute::AMERICAS, - Self::OC1 => RegionalRoute::AMERICAS, - Self::PBE1 => RegionalRoute::AMERICAS, - - Self::JP1 => RegionalRoute::ASIA, - Self::KR => RegionalRoute::ASIA, - + Self::BR1 => RegionalRoute::AMERICAS, Self::EUN1 => RegionalRoute::EUROPE, Self::EUW1 => RegionalRoute::EUROPE, - Self::RU => RegionalRoute::EUROPE, - Self::TR1 => RegionalRoute::EUROPE, + Self::JP1 => RegionalRoute::ASIA, + Self::KR => RegionalRoute::ASIA, + Self::LA1 => RegionalRoute::AMERICAS, + Self::LA2 => RegionalRoute::AMERICAS, + Self::NA1 => RegionalRoute::AMERICAS, + Self::OC1 => RegionalRoute::SEA, + Self::PH2 => RegionalRoute::SEA, + Self::RU => RegionalRoute::EUROPE, + Self::SG2 => RegionalRoute::SEA, + Self::TH2 => RegionalRoute::SEA, + Self::TR1 => RegionalRoute::EUROPE, + Self::TW2 => RegionalRoute::SEA, + Self::VN2 => RegionalRoute::SEA, + Self::PBE1 => RegionalRoute::AMERICAS, } } - /// Used in Tournament API. + /// Converts this [`PlatformRoute`] into its corresponding + /// [`RegionalRoute`] for LoR endpoints. + /// For example, [`lor-match-v1`](crate::endpoints::LorMatchV1). + pub fn to_regional_lor(self) -> RegionalRoute { + match self { + Self::BR1 => RegionalRoute::AMERICAS, + Self::EUN1 => RegionalRoute::EUROPE, + Self::EUW1 => RegionalRoute::EUROPE, + Self::JP1 => RegionalRoute::ASIA, + Self::KR => RegionalRoute::ASIA, + Self::LA1 => RegionalRoute::AMERICAS, + Self::LA2 => RegionalRoute::AMERICAS, + Self::NA1 => RegionalRoute::AMERICAS, + Self::OC1 => RegionalRoute::SEA, + Self::PH2 => RegionalRoute::SEA, + Self::RU => RegionalRoute::SEA, + Self::SG2 => RegionalRoute::SEA, + Self::TH2 => RegionalRoute::SEA, + Self::TR1 => RegionalRoute::SEA, + Self::TW2 => RegionalRoute::SEA, + Self::VN2 => RegionalRoute::SEA, + Self::PBE1 => RegionalRoute::AMERICAS, + } + } + + /// Used in LoL Tournament API. pub fn as_region_str(self) -> &'static str { match self { - Self::BR1 => "BR", + Self::BR1 => "BR", Self::EUN1 => "EUNE", Self::EUW1 => "EUW", - Self::JP1 => "JP", - Self::LA1 => "LAN", - Self::LA2 => "LAS", - Self::NA1 => "NA", - Self::OC1 => "OCE", + Self::JP1 => "JP", + Self::LA1 => "LAN", + Self::LA2 => "LAS", + Self::NA1 => "NA", + Self::OC1 => "OCE", + Self::TR1 => "TR", Self::PBE1 => "PBE", - Self::RU => "RU", - Self::TR1 => "TR", - - Self::KR => "KR", + other => other.into() } } } @@ -132,208 +236,39 @@ impl PlatformRoute { #[repr(u8)] #[non_exhaustive] pub enum ValPlatformRoute { - /// Valorant's Asian Pacific platform. + /// Asia-Pacific. + /// + /// `64` (riotapi-schema ID/repr) AP = 64, - /// Valorant's Brazil platform. + /// Brazil. + /// + /// `65` (riotapi-schema ID/repr) BR = 65, - /// Valorant's Europe platform. + /// Europe. + /// + /// `66` (riotapi-schema ID/repr) EU = 66, - /// Valorant's Latin America platform. - LATAM = 68, - - /// Valorant's North America platform. - NA = 69, - - /// Valorant's Korea platform. + /// Korea. + /// + /// `70` (riotapi-schema ID/repr) KR = 70, + /// Latin America. + /// + /// `68` (riotapi-schema ID/repr) + LATAM = 68, - /// Valorant's esports platform. + /// North America. + /// + /// `69` (riotapi-schema ID/repr) + NA = 69, + + /// Special esports platform. + /// + /// `95` (riotapi-schema ID/repr) ESPORTS = 95, -} - -/// Utility enum containing all routing variants. -#[derive(Debug)] -#[derive(PartialEq, Eq, Hash, PartialOrd, Ord)] -#[derive(Clone, Copy)] -#[repr(u8)] -#[non_exhaustive] -pub enum Route { - /// Sub-variant for [`RegionalRoute`]s. - Regional(RegionalRoute), - /// Sub-variant for [`PlatformRoute`]s. - Platform(PlatformRoute), - /// Sub-variant for [`ValPlatformRoute`]s. - ValPlatform(ValPlatformRoute), -} - -impl From for &'static str { - fn from(route: Route) -> Self { - match route { - Route::Regional(r) => r.into(), - Route::Platform(r) => r.into(), - Route::ValPlatform(r) => r.into(), - } - } -} - -impl From for u8 { - fn from(route: Route) -> Self { - match route { - Route::Regional(r) => r.into(), - Route::Platform(r) => r.into(), - Route::ValPlatform(r) => r.into(), - } - } -} - -impl num_enum::TryFromPrimitive for Route { - type Primitive = u8; - - const NAME: &'static str = stringify!(Route); - - fn try_from_primitive(number: Self::Primitive) -> Result> { - RegionalRoute::try_from_primitive(number) - .map(Route::Regional) - .or_else(|_| PlatformRoute::try_from_primitive(number) - .map(Route::Platform)) - .or_else(|_| ValPlatformRoute::try_from_primitive(number) - .map(Route::ValPlatform)) - .map_err(|_| num_enum::TryFromPrimitiveError { number }) - } -} - -impl std::convert::TryFrom for Route { - type Error = num_enum::TryFromPrimitiveError; - fn try_from(number: u8) -> Result> { - Self::try_from_primitive(number) - } -} - -impl std::fmt::Display for Route { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::Regional(r) => r.fmt(f), - Self::Platform(r) => r.fmt(f), - Self::ValPlatform(r) => r.fmt(f), - } - } -} - -impl std::str::FromStr for Route { - type Err = strum::ParseError; - fn from_str(s: &str) -> Result { - RegionalRoute::from_str(s) - .map(Self::Regional) - .or_else(|_| PlatformRoute::from_str(s) - .map(Self::Platform)) - .or_else(|_| ValPlatformRoute::from_str(s) - .map(Self::ValPlatform)) - .map_err(|_| strum::ParseError::VariantNotFound) - } -} - -impl Route { - /// Returns an iterator over all routes. Starts with [`Self::Regional`], - /// then [`Self::Platform`], and finally [`Self::ValPlatform`]. - pub fn iter() -> impl Iterator { - use strum::IntoEnumIterator; - - let regional = RegionalRoute::iter() - .map(Self::Regional); - let platform = PlatformRoute::iter() - .map(Self::Platform); - let val_platform = ValPlatformRoute::iter() - .map(Self::ValPlatform); - - regional - .chain(platform) - .chain(val_platform) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_route_tostring() { - assert_eq!("AMERICAS", Into::<&'static str>::into(Route::Regional(RegionalRoute::AMERICAS))); - assert_eq!("KR", Into::<&'static str>::into(Route::Platform(PlatformRoute::KR))); - assert_eq!("KR", Into::<&'static str>::into(Route::ValPlatform(ValPlatformRoute::KR))); - } - - #[test] - fn test_route_iter() { - for (i, route) in Route::iter().enumerate() { - println!("{:>2} {:<10} {:>3}", i, route, u8::from(route)); - } - } - - #[test] - fn test_route_tryfrom() { - for x in u8::MIN..=u8::MAX { - if let Ok(route) = std::convert::TryInto::::try_into(x) { - println!("{:>3} {:<8}", x, route); - } - } - } - - #[test] - fn test_regional_tostring() { - assert_eq!("AMERICAS", RegionalRoute::AMERICAS.to_string()); - assert_eq!("SEA", RegionalRoute::SEA.to_string()); - - assert_eq!("AMERICAS", Into::<&'static str>::into(RegionalRoute::AMERICAS)); - assert_eq!("SEA", Into::<&'static str>::into(RegionalRoute::SEA)); - } - - #[test] - fn test_regional_parse() { - assert_eq!(Ok(RegionalRoute::AMERICAS), "AMERICAS".parse()); - assert_eq!(Ok(RegionalRoute::SEA), "SEA".parse()); - assert!("NA".parse::().is_err()); - } - - #[test] - fn test_platform_tostring() { - assert_eq!("BR1", PlatformRoute::BR1.to_string()); - assert_eq!("KR", PlatformRoute::KR.to_string()); - - assert_eq!("BR1", Into::<&'static str>::into(PlatformRoute::BR1)); - assert_eq!("KR", Into::<&'static str>::into(PlatformRoute::KR)); - } - - #[test] - fn test_platform_parse() { - assert_eq!(Ok(PlatformRoute::BR1), "BR1".parse()); - assert_eq!(Ok(PlatformRoute::KR), "KR".parse()); - assert_eq!(Ok(PlatformRoute::JP1), "JP1".parse()); - assert_eq!(Ok(PlatformRoute::JP1), "JP".parse()); - assert_eq!(Ok(PlatformRoute::NA1), "NA1".parse()); - assert_eq!(Ok(PlatformRoute::NA1), "NA".parse()); - assert!("LA".parse::().is_err()); - } - - #[test] - fn test_valplatform_tostring() { - assert_eq!("AP", ValPlatformRoute::AP.to_string()); - assert_eq!("KR", ValPlatformRoute::KR.to_string()); - assert_eq!("ESPORTS", ValPlatformRoute::ESPORTS.to_string()); - - assert_eq!("AP", Into::<&'static str>::into(ValPlatformRoute::AP)); - assert_eq!("KR", Into::<&'static str>::into(ValPlatformRoute::KR)); - assert_eq!("ESPORTS", Into::<&'static str>::into(ValPlatformRoute::ESPORTS)); - } - - #[test] - fn test_valplatform_parse() { - assert_eq!(Ok(ValPlatformRoute::AP), "AP".parse()); - assert_eq!(Ok(ValPlatformRoute::KR), "KR".parse()); - assert_eq!(Ok(ValPlatformRoute::ESPORTS), "ESPORTS".parse()); - assert!("SEA".parse::().is_err()); - } + } diff --git a/riven/src/consts/route_ext.rs b/riven/src/consts/route_ext.rs new file mode 100644 index 0000000..f9391e1 --- /dev/null +++ b/riven/src/consts/route_ext.rs @@ -0,0 +1,184 @@ +use super::{ RegionalRoute, PlatformRoute, ValPlatformRoute }; + +/// Utility enum containing all routing variants. +#[derive(Debug)] +#[derive(PartialEq, Eq, Hash, PartialOrd, Ord)] +#[derive(Clone, Copy)] +#[repr(u8)] +#[non_exhaustive] +pub enum Route { + /// Sub-variant for [`RegionalRoute`]s. + Regional(RegionalRoute), + /// Sub-variant for [`PlatformRoute`]s. + Platform(PlatformRoute), + /// Sub-variant for [`ValPlatformRoute`]s. + ValPlatform(ValPlatformRoute), +} + +impl From for &'static str { + fn from(route: Route) -> Self { + match route { + Route::Regional(r) => r.into(), + Route::Platform(r) => r.into(), + Route::ValPlatform(r) => r.into(), + } + } +} + +impl From for u8 { + fn from(route: Route) -> Self { + match route { + Route::Regional(r) => r.into(), + Route::Platform(r) => r.into(), + Route::ValPlatform(r) => r.into(), + } + } +} + +impl num_enum::TryFromPrimitive for Route { + type Primitive = u8; + + const NAME: &'static str = stringify!(Route); + + fn try_from_primitive(number: Self::Primitive) -> Result> { + RegionalRoute::try_from_primitive(number) + .map(Route::Regional) + .or_else(|_| PlatformRoute::try_from_primitive(number) + .map(Route::Platform)) + .or_else(|_| ValPlatformRoute::try_from_primitive(number) + .map(Route::ValPlatform)) + .map_err(|_| num_enum::TryFromPrimitiveError { number }) + } +} + +impl std::convert::TryFrom for Route { + type Error = num_enum::TryFromPrimitiveError; + fn try_from(number: u8) -> Result> { + ::try_from_primitive(number) + } +} + +impl std::fmt::Display for Route { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Regional(r) => r.fmt(f), + Self::Platform(r) => r.fmt(f), + Self::ValPlatform(r) => r.fmt(f), + } + } +} + +impl std::str::FromStr for Route { + type Err = strum::ParseError; + fn from_str(s: &str) -> Result { + RegionalRoute::from_str(s) + .map(Self::Regional) + .or_else(|_| PlatformRoute::from_str(s) + .map(Self::Platform)) + .or_else(|_| ValPlatformRoute::from_str(s) + .map(Self::ValPlatform)) + .map_err(|_| strum::ParseError::VariantNotFound) + } +} + +impl Route { + /// Returns an iterator over all routes. Starts with [`Self::Regional`], + /// then [`Self::Platform`], and finally [`Self::ValPlatform`]. + pub fn iter() -> impl Iterator { + use strum::IntoEnumIterator; + + let regional = RegionalRoute::iter() + .map(Self::Regional); + let platform = PlatformRoute::iter() + .map(Self::Platform); + let val_platform = ValPlatformRoute::iter() + .map(Self::ValPlatform); + + regional + .chain(platform) + .chain(val_platform) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_route_tostring() { + assert_eq!("AMERICAS", Into::<&'static str>::into(Route::Regional(RegionalRoute::AMERICAS))); + assert_eq!("KR", Into::<&'static str>::into(Route::Platform(PlatformRoute::KR))); + assert_eq!("KR", Into::<&'static str>::into(Route::ValPlatform(ValPlatformRoute::KR))); + } + + #[test] + fn test_route_iter() { + for (i, route) in Route::iter().enumerate() { + println!("{:>2} {:<10} {:>3}", i, route, u8::from(route)); + } + } + + #[test] + fn test_route_tryfrom() { + for x in u8::MIN..=u8::MAX { + if let Ok(route) = std::convert::TryInto::::try_into(x) { + println!("{:>3} {:<8}", x, route); + } + } + } + + #[test] + fn test_regional_tostring() { + assert_eq!("AMERICAS", RegionalRoute::AMERICAS.to_string()); + assert_eq!("SEA", RegionalRoute::SEA.to_string()); + + assert_eq!("AMERICAS", Into::<&'static str>::into(RegionalRoute::AMERICAS)); + assert_eq!("SEA", Into::<&'static str>::into(RegionalRoute::SEA)); + } + + #[test] + fn test_regional_parse() { + assert_eq!(Ok(RegionalRoute::AMERICAS), "AMERICAS".parse()); + assert_eq!(Ok(RegionalRoute::SEA), "SEA".parse()); + assert!("NA".parse::().is_err()); + } + + #[test] + fn test_platform_tostring() { + assert_eq!("BR1", PlatformRoute::BR1.to_string()); + assert_eq!("KR", PlatformRoute::KR.to_string()); + + assert_eq!("BR1", Into::<&'static str>::into(PlatformRoute::BR1)); + assert_eq!("KR", Into::<&'static str>::into(PlatformRoute::KR)); + } + + #[test] + fn test_platform_parse() { + assert_eq!(Ok(PlatformRoute::BR1), "BR1".parse()); + assert_eq!(Ok(PlatformRoute::KR), "KR".parse()); + assert_eq!(Ok(PlatformRoute::JP1), "JP1".parse()); + assert_eq!(Ok(PlatformRoute::JP1), "JP".parse()); + assert_eq!(Ok(PlatformRoute::NA1), "NA1".parse()); + assert_eq!(Ok(PlatformRoute::NA1), "NA".parse()); + assert!("LA".parse::().is_err()); + } + + #[test] + fn test_valplatform_tostring() { + assert_eq!("AP", ValPlatformRoute::AP.to_string()); + assert_eq!("KR", ValPlatformRoute::KR.to_string()); + assert_eq!("ESPORTS", ValPlatformRoute::ESPORTS.to_string()); + + assert_eq!("AP", Into::<&'static str>::into(ValPlatformRoute::AP)); + assert_eq!("KR", Into::<&'static str>::into(ValPlatformRoute::KR)); + assert_eq!("ESPORTS", Into::<&'static str>::into(ValPlatformRoute::ESPORTS)); + } + + #[test] + fn test_valplatform_parse() { + assert_eq!(Ok(ValPlatformRoute::AP), "AP".parse()); + assert_eq!(Ok(ValPlatformRoute::KR), "KR".parse()); + assert_eq!(Ok(ValPlatformRoute::ESPORTS), "ESPORTS".parse()); + assert!("SEA".parse::().is_err()); + } +} diff --git a/riven/srcgen/consts/route.rs.dt b/riven/srcgen/consts/route.rs.dt new file mode 100644 index 0000000..3d1a4b8 --- /dev/null +++ b/riven/srcgen/consts/route.rs.dt @@ -0,0 +1,142 @@ +{{ + const dotUtils = require('./dotUtils.js'); + const routesTable = require('./.routesTable.json'); +}}{{= dotUtils.preamble() }} + +use num_enum::{ IntoPrimitive, TryFromPrimitive }; +use strum_macros::{ EnumString, EnumIter, Display, IntoStaticStr }; + +/// Regional routes, used in tournament services, Legends of Runterra, and other endpoints. +#[derive(Debug)] +#[derive(PartialEq, Eq, Hash, PartialOrd, Ord)] +#[derive(IntoPrimitive, TryFromPrimitive)] +#[derive(EnumString, EnumIter, Display, IntoStaticStr)] +#[derive(Clone, Copy)] +#[repr(u8)] +#[non_exhaustive] +pub enum RegionalRoute { +{{ + for (const [ name, { id, description, deprecated } ] of Object.entries(routesTable['regional'])) { + const desc = description.split('\n'); +}} +{{~ desc :line }} + /// {{= line }} +{{~}} + /// + /// `{{= id }}` (riotapi-schema ID/repr) +{{? deprecated }} + #[deprecated] +{{?}} + {{= name.toUpperCase() }} = {{= id }}, + +{{ + } +}} +} + +/// Platform routes for League of Legends (LoL), Teamfight Tactics (TFT), and Legends of Runeterra (LoR). +#[derive(Debug)] +#[derive(PartialEq, Eq, Hash, PartialOrd, Ord)] +#[derive(IntoPrimitive, TryFromPrimitive)] +#[derive(EnumString, EnumIter, Display, IntoStaticStr)] +#[derive(Clone, Copy)] +#[repr(u8)] +#[non_exhaustive] +// Note: strum(serialize = ...) actually specifies extra DEserialization values. +pub enum PlatformRoute { +{{ + for (const [ name, { id, description, altName, deprecated } ] of Object.entries(routesTable['platform'])) { + const desc = description.split('\n'); +}} +{{~ desc :line }} + /// {{= line }} +{{~}} + /// + /// `{{= id }}` (riotapi-schema ID/repr) +{{? deprecated }} + #[deprecated] +{{?}} +{{? altName }} + #[strum(to_string="{{= name.toUpperCase() }}", serialize="{{= altName }}")] +{{?}} + {{= name.toUpperCase() }} = {{= id }}, + +{{ + } +}} +} + +impl PlatformRoute { + /// Converts this [`PlatformRoute`] into its corresponding + /// [`RegionalRoute`] for LoL and TFT match endpoints. + /// For example, [`match-v5`](crate::endpoints::MatchV5). + pub fn to_regional(self) -> RegionalRoute { + match self { +{{ + for (const [ name, { regionalRoute } ] of Object.entries(routesTable['platform'])) { +}} + Self::{{= name.toUpperCase() }} => RegionalRoute::{{= regionalRoute.toUpperCase() }}, +{{ + } +}} + } + } + + /// Converts this [`PlatformRoute`] into its corresponding + /// [`RegionalRoute`] for LoR endpoints. + /// For example, [`lor-match-v1`](crate::endpoints::LorMatchV1). + pub fn to_regional_lor(self) -> RegionalRoute { + match self { +{{ + for (const [ name, { regionalRouteLor } ] of Object.entries(routesTable['platform'])) { +}} + Self::{{= name.toUpperCase() }} => RegionalRoute::{{= regionalRouteLor.toUpperCase() }}, +{{ + } +}} + } + } + + /// Used in LoL Tournament API. + pub fn as_region_str(self) -> &'static str { + match self { +{{ + for (const [ name, { altName } ] of Object.entries(routesTable['platform'])) { + if (!altName) continue; +}} + Self::{{= name.toUpperCase() }} => "{{= altName }}", +{{ + } +}} + other => other.into() + } + } +} + +/// Platform routes for Valorant. +#[derive(Debug)] +#[derive(PartialEq, Eq, Hash, PartialOrd, Ord)] +#[derive(IntoPrimitive, TryFromPrimitive)] +#[derive(EnumString, EnumIter, Display, IntoStaticStr)] +#[derive(Clone, Copy)] +#[repr(u8)] +#[non_exhaustive] +pub enum ValPlatformRoute { +{{ + for (const [ name, { id, description, deprecated } ] of Object.entries(routesTable['val-platform'])) { + const desc = description.split('\n'); +}} +{{~ desc :line }} + /// {{= line }} +{{~}} + /// + /// `{{= id }}` (riotapi-schema ID/repr) +{{? deprecated }} + #[deprecated] +{{?}} + {{= name.toUpperCase() }} = {{= id }}, + +{{ + } +}} +} diff --git a/riven/srcgen/index.js b/riven/srcgen/index.js index 28d9a71..a62f55a 100644 --- a/riven/srcgen/index.js +++ b/riven/srcgen/index.js @@ -39,6 +39,10 @@ const files = [ 'http://www.mingweisamuel.com/riotapi-schema/enums/maps.json', '.maps.json' ], + [ + 'https://raw.githubusercontent.com/MingweiSamuel/riotapi-schema/master/src/data/routesTable.json', + '.routesTable.json' + ], ]; const downloadFilesPromise = Promise.all(files.map(([url, file]) => req(url)