#[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum ResourceType {
#[serde(rename = "energy")]
Energy,
#[serde(rename = "power")]
Power,
#[serde(rename = "H")]
Hydrogen,
#[serde(rename = "O")]
Oxygen,
#[serde(rename = "U")]
Utrium,
#[serde(rename = "L")]
Lemergium,
#[serde(rename = "K")]
Keanium,
#[serde(rename = "Z")]
Zynthium,
#[serde(rename = "X")]
Catalyst,
#[serde(rename = "G")]
Ghodium,
#[serde(rename = "OH")]
Hydroxide,
#[serde(rename = "ZK")]
ZynthiumKeanite,
#[serde(rename = "UL")]
UtriumLemergite,
#[serde(rename = "UH")]
UtriumHydride,
#[serde(rename = "UO")]
UtriumOxide,
#[serde(rename = "KH")]
KeaniumHydride,
#[serde(rename = "KO")]
KeaniumOxide,
#[serde(rename = "LH")]
LemergiumHydride,
#[serde(rename = "LO")]
LemergiumOxide,
#[serde(rename = "ZH")]
ZynthiumHydride,
#[serde(rename = "ZO")]
ZynthiumOxide,
#[serde(rename = "GH")]
GhodiumHydride,
#[serde(rename = "GO")]
GhodiumOxide,
#[serde(rename = "UH2O")]
UtriumAcid,
#[serde(rename = "UHO2")]
UtriumAlkalide,
#[serde(rename = "KH2O")]
KeaniumAcid,
#[serde(rename = "KHO2")]
KeaniumAlkalide,
#[serde(rename = "LH2O")]
LemergiumAcid,
#[serde(rename = "LHO2")]
LemergiumAlkalide,
#[serde(rename = "ZH2O")]
ZynthiumAcid,
#[serde(rename = "ZHO2")]
ZynthiumAlkalide,
#[serde(rename = "GH2O")]
GhodiumAcid,
#[serde(rename = "GHO2")]
GhodiumAlkalide,
#[serde(rename = "XUH2O")]
CatalyzedUtriumAcid,
#[serde(rename = "XUHO2")]
CatalyzedUtriumAlkalide,
#[serde(rename = "XKH2O")]
CatalyzedKeaniumAcid,
#[serde(rename = "XKHO2")]
CatalyzedKeaniumAlkalide,
#[serde(rename = "XLH2O")]
CatalyzedLemergiumAcid,
#[serde(rename = "XLHO2")]
CatalyzedLemergiumAlkalide,
#[serde(rename = "XZH2O")]
CatalyzedZynthiumAcid,
#[serde(rename = "XZHO2")]
CatalyzedZynthiumAlkalide,
#[serde(rename = "XGH2O")]
CatalyzedGhodiumAcid,
#[serde(rename = "XGHO2")]
CatalyzedGhodiumAlkalide,
}
basic_updatable!(ResourceType);
impl ResourceType {
pub fn to_resource_string(&self) -> &'static str {
match *self {
ResourceType::Energy => "energy",
ResourceType::Power => "power",
ResourceType::Hydrogen => "H",
ResourceType::Oxygen => "O",
ResourceType::Utrium => "U",
ResourceType::Lemergium => "L",
ResourceType::Keanium => "K",
ResourceType::Zynthium => "Z",
ResourceType::Catalyst => "X",
ResourceType::Ghodium => "G",
ResourceType::Hydroxide => "OH",
ResourceType::ZynthiumKeanite => "ZK",
ResourceType::UtriumLemergite => "UL",
ResourceType::UtriumHydride => "UH",
ResourceType::UtriumOxide => "UO",
ResourceType::KeaniumHydride => "KH",
ResourceType::KeaniumOxide => "KO",
ResourceType::LemergiumHydride => "LH",
ResourceType::LemergiumOxide => "LO",
ResourceType::ZynthiumHydride => "ZH",
ResourceType::ZynthiumOxide => "ZO",
ResourceType::GhodiumHydride => "GH",
ResourceType::GhodiumOxide => "GO",
ResourceType::UtriumAcid => "UH2O",
ResourceType::UtriumAlkalide => "UHO2",
ResourceType::KeaniumAcid => "KH2O",
ResourceType::KeaniumAlkalide => "KHO2",
ResourceType::LemergiumAcid => "LH2O",
ResourceType::LemergiumAlkalide => "LHO2",
ResourceType::ZynthiumAcid => "ZH2O",
ResourceType::ZynthiumAlkalide => "ZHO2",
ResourceType::GhodiumAcid => "GH2O",
ResourceType::GhodiumAlkalide => "GHO2",
ResourceType::CatalyzedUtriumAcid => "XUH2O",
ResourceType::CatalyzedUtriumAlkalide => "XUHO2",
ResourceType::CatalyzedKeaniumAcid => "XKH2O",
ResourceType::CatalyzedKeaniumAlkalide => "XKHO2",
ResourceType::CatalyzedLemergiumAcid => "XLH2O",
ResourceType::CatalyzedLemergiumAlkalide => "XLHO2",
ResourceType::CatalyzedZynthiumAcid => "XZH2O",
ResourceType::CatalyzedZynthiumAlkalide => "XZHO2",
ResourceType::CatalyzedGhodiumAcid => "XGH2O",
ResourceType::CatalyzedGhodiumAlkalide => "XGHO2",
}
}
}
pub(crate) mod null_is_default {
use serde::de::{Deserialize, Deserializer};
pub fn deserialize<'de, T, D>(d: D) -> Result<T, D::Error>
where
T: Default + Deserialize<'de>,
D: Deserializer<'de>,
{
Deserialize::deserialize(d).map(|x: Option<T>| x.unwrap_or(T::default()))
}
}
pub(crate) mod null_is_default_and_always_some {
use serde::de::{Deserialize, Deserializer};
pub fn deserialize<'de, T, D>(d: D) -> Result<Option<T>, D::Error>
where
T: Default + Deserialize<'de>,
D: Deserializer<'de>,
{
Deserialize::deserialize(d)
.map(|x: Option<T>| x.unwrap_or_default())
.map(Some)
}
}
macro_rules! with_resource_fields_and_update_struct {
(
{
$full_resource_type:path;
$(
$resource_type_ident:ident => $field_ident:ident => $serde_ident:tt => $next_iterator_type:expr;
)*
}
$( #[$struct_attr:meta] )*
pub struct $name:ident {
$(
$(#[$field_attr:meta])*
pub $field:ident : $type:ty,
)*
}
$( #[$update_struct_attr:meta] )*
$( ($update_extra:tt) )*
pub struct $update_name:ident { ... }
) => (
with_resource_fields_and_update_struct! {
{
$full_resource_type;
$(
$resource_type_ident => $field_ident => $serde_ident => $next_iterator_type;
)*
}
$( #[$struct_attr] )*
pub struct $name {
$(
$( #[$field_attr] )*
pub $field : $type,
)*
}
$( #[$update_struct_attr] )*
$( ($update_extra) )*
pub struct $update_name {
$(
$( #[$field_attr] )*
- $field : $type,
)*
}
}
);
(
{
$full_resource_type: path;
$(
$resource_type_ident:ident => $field_ident:ident => $serde_ident:tt => $next_iterator_type:expr;
)*
}
$( #[$struct_attr:meta] )*
pub struct $name:ident {
$( $struct_field:tt )*
}
$( #[$update_struct_attr:meta] )*
$( ($update_extra:tt) )*
pub struct $update_name:ident {
$( $update_field:tt )*
}
) => (
with_base_fields_and_update_struct! {
$( #[$struct_attr] )*
pub struct $name {
$(
#[serde(default, rename = $serde_ident,
with = "crate::websocket::resources::null_is_default")]
pub $field_ident: i32,
)*
$( $struct_field )*
}
$( #[$update_struct_attr] )*
$( ($update_extra) )*
pub struct $update_name {
$(
#[serde(
default,
rename = $serde_ident,
with = "crate::websocket::resources\
::null_is_default_and_always_some"
)]
(no_extra_meta)
- $field_ident: i32,
)*
$( $update_field )*
}
}
)
}
macro_rules! resource_iterator_for {
(
{
$full_resource_type: path;
$(
$resource_type_ident:ident => $field_ident:ident => $serde_ident:tt => $next_iterator_type:expr;
)*
}
$( #[$struct_attr:meta] )*
pub struct $name:ident ( $from:ident );
) => (
$( #[$struct_attr] )*
pub struct $name<'a> {
source: &'a $from,
current_resource: Option<$full_resource_type>,
}
impl<'a> $name<'a> {
fn new(input: &'a $from) -> Self {
use $full_resource_type::*;
$name {
source: input,
current_resource: Some(Energy)
}
}
}
impl<'a> ::std::iter::Iterator for $name<'a> {
type Item = ($full_resource_type, i32);
fn next(&mut self) -> Option<Self::Item> {
use $full_resource_type::*;
while let Some(to_check) = self.current_resource {
let (amount, next) = match to_check {
$(
$resource_type_ident => {
(self.source.$field_ident, $next_iterator_type)
}
)*
};
self.current_resource = next;
if amount > 0 {
return Some((to_check, amount));
}
}
None
}
}
)
}
#[allow(unused_macros)]
macro_rules! resource_list {
() => (
::websocket::resources::ResourceType;
Energy => energy => "energy"
=> Some(::websocket::resources::ResourceType::Power);
Power => power => "power"
=> Some(::websocket::resources::ResourceType::Hydrogen);
Hydrogen => hydrogen => "H"
=> Some(::websocket::resources::ResourceType::Oxygen);
Oxygen => oxygen => "O"
=> Some(::websocket::resources::ResourceType::Utrium);
Utrium => utrium => "U"
=> Some(::websocket::resources::ResourceType::Lemergium);
Lemergium => lemergium => "L"
=> Some(::websocket::resources::ResourceType::Keanium);
Keanium => keanium => "K"
=> Some(::websocket::resources::ResourceType::Zynthium);
Zynthium => zynthium => "Z"
=> Some(::websocket::resources::ResourceType::Catalyst);
Catalyst => catalyst => "X"
=> Some(::websocket::resources::ResourceType::Ghodium);
Ghodium => ghodium => "G"
=> Some(::websocket::resources::ResourceType::Hydroxide);
Hydroxide => hydroxide => "OH"
=> Some(::websocket::resources::ResourceType::ZynthiumKeanite);
ZynthiumKeanite => zynthium_keanite => "ZK"
=> Some(::websocket::resources::ResourceType::UtriumLemergite);
UtriumLemergite => utrium_lemergite => "UL"
=> Some(::websocket::resources::ResourceType::UtriumHydride);
UtriumHydride => utrium_hydride => "UH"
=> Some(::websocket::resources::ResourceType::UtriumOxide);
UtriumOxide => utrium_oxide => "UO"
=> Some(::websocket::resources::ResourceType::KeaniumHydride);
KeaniumHydride => keanium_hydride => "KH"
=> Some(::websocket::resources::ResourceType::KeaniumOxide);
KeaniumOxide => keanium_oxide => "KO"
=> Some(::websocket::resources::ResourceType::LemergiumHydride);
LemergiumHydride => lemergium_hydride => "LH"
=> Some(::websocket::resources::ResourceType::LemergiumOxide);
LemergiumOxide => lemergium_oxide => "LO"
=> Some(::websocket::resources::ResourceType::ZynthiumHydride);
ZynthiumHydride => zynthium_hydride => "ZH"
=> Some(::websocket::resources::ResourceType::ZynthiumOxide);
ZynthiumOxide => zynthium_oxide => "ZO"
=> Some(::websocket::resources::ResourceType::GhodiumHydride);
GhodiumHydride => ghodium_hydride => "GH"
=> Some(::websocket::resources::ResourceType::GhodiumOxide);
GhodiumOxide => ghodium_oxide => "GO"
=> Some(::websocket::resources::ResourceType::UtriumAcid);
UtriumAcid => utrium_acid => "UH2O"
=> Some(::websocket::resources::ResourceType::UtriumAlkalide);
UtriumAlkalide => utrium_alkalide => "UHO2"
=> Some(::websocket::resources::ResourceType::KeaniumAcid);
KeaniumAcid => keanium_acid => "KH2O"
=> Some(::websocket::resources::ResourceType::KeaniumAlkalide);
KeaniumAlkalide => keanium_alkalide => "KHO2"
=> Some(::websocket::resources::ResourceType::LemergiumAcid);
LemergiumAcid => lemergium_acid => "LH2O"
=> Some(::websocket::resources::ResourceType::LemergiumAlkalide);
LemergiumAlkalide => lemergium_alkalide => "LHO2"
=> Some(::websocket::resources::ResourceType::ZynthiumAcid);
ZynthiumAcid => zynthium_acid => "ZH2O"
=> Some(::websocket::resources::ResourceType::ZynthiumAlkalide);
ZynthiumAlkalide => zynthium_alkalide => "ZHO2"
=> Some(::websocket::resources::ResourceType::GhodiumAcid);
GhodiumAcid => ghodium_acid => "GH2O"
=> Some(::websocket::resources::ResourceType::GhodiumAlkalide);
GhodiumAlkalide => ghodium_alkalide => "GHO2"
=> Some(::websocket::resources::ResourceType::CatalyzedUtriumAcid);
CatalyzedUtriumAcid => catalyzed_utrium_acid => "XUH2O"
=> Some(::websocket::resources::ResourceType::CatalyzedUtriumAlkalide);
CatalyzedUtriumAlkalide => catalyzed_utrium_alkalide => "XUHO2"
=> Some(::websocket::resources::ResourceType::CatalyzedKeaniumAcid);
CatalyzedKeaniumAcid => catalyzed_keanium_acid => "XKH2O"
=> Some(::websocket::resources::ResourceType::CatalyzedKeaniumAlkalide);
CatalyzedKeaniumAlkalide => catalyzed_keanium_alkalide => "XKHO2"
=> Some(::websocket::resources::ResourceType::CatalyzedLemergiumAcid);
CatalyzedLemergiumAcid => catalyzed_lemergium_acid => "XLH2O"
=> Some(::websocket::resources::ResourceType::CatalyzedLemergiumAlkalide);
CatalyzedLemergiumAlkalide => catalyzed_lemergium_alkalide => "XLHO2"
=> Some(::websocket::resources::ResourceType::CatalyzedZynthiumAcid);
CatalyzedZynthiumAcid => catalyzed_zynthium_acid => "XZH2O"
=> Some(::websocket::resources::ResourceType::CatalyzedZynthiumAlkalide);
CatalyzedZynthiumAlkalide => catalyzed_zynthium_alkalide => "XZHO2"
=> Some(::websocket::resources::ResourceType::CatalyzedGhodiumAcid);
CatalyzedGhodiumAcid => catalyzed_ghodium_acid => "XGH2O"
=> Some(::websocket::resources::ResourceType::CatalyzedGhodiumAlkalide);
CatalyzedGhodiumAlkalide => catalyzed_ghodium_alkalide => "XGHO2"
=> None;
)
}