use std::fmt::{Display, Formatter};
use std::str::FromStr;
use phf::phf_map;
use strum_macros::{Display, EnumString};
use crate::game::Game;
#[cfg(feature = "jomini")]
use crate::item::Item;
#[cfg(feature = "ck3")]
include!("ck3/include/datatypes.rs");
#[cfg(feature = "vic3")]
include!("vic3/include/datatypes.rs");
#[cfg(feature = "imperator")]
include!("imperator/include/datatypes.rs");
#[cfg(feature = "eu5")]
include!("eu5/include/datatypes.rs");
#[cfg(feature = "hoi4")]
include!("hoi4/include/datatypes.rs");
#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)]
#[allow(non_camel_case_types)]
pub enum Datatype {
Unknown,
AnyScope,
CFixedPoint,
CString,
CUTF8String,
CVector2f,
CVector2i,
CVector3f,
CVector3i,
CVector4f,
CVector4i,
Date,
Scope,
TopScope,
bool,
double,
float,
int16,
int32,
int64,
int8,
uint16,
uint32,
uint64,
uint8,
void,
#[cfg(feature = "ck3")]
Ck3(Ck3Datatype),
#[cfg(feature = "vic3")]
Vic3(Vic3Datatype),
#[cfg(feature = "imperator")]
Imperator(ImperatorDatatype),
#[cfg(feature = "eu5")]
Eu5(Eu5Datatype),
#[cfg(feature = "hoi4")]
Hoi4(Hoi4Datatype),
}
static STR_DATATYPE_MAP: phf::Map<&'static str, Datatype> = phf_map! {
"Unknown" => Datatype::Unknown,
"AnyScope" => Datatype::AnyScope,
"CFixedPoint" => Datatype::CFixedPoint,
"CString" => Datatype::CString,
"CUTF8String" => Datatype::CUTF8String,
"CVector2f" => Datatype::CVector2f,
"CVector2i" => Datatype::CVector2i,
"CVector3f" => Datatype::CVector3f,
"CVector3i" => Datatype::CVector3i,
"CVector4f" => Datatype::CVector4f,
"CVector4i" => Datatype::CVector4i,
"Date" => Datatype::Date,
"Scope" => Datatype::Scope,
"TopScope" => Datatype::TopScope,
"bool" => Datatype::bool,
"double" => Datatype::double,
"float" => Datatype::float,
"int16" => Datatype::int16,
"int32" => Datatype::int32,
"int64" => Datatype::int64,
"int8" => Datatype::int8,
"uint16" => Datatype::uint16,
"uint32" => Datatype::uint32,
"uint64" => Datatype::uint64,
"uint8" => Datatype::uint8,
"void" => Datatype::void,
};
impl FromStr for Datatype {
type Err = strum::ParseError;
fn from_str(s: &str) -> Result<Self, strum::ParseError> {
STR_DATATYPE_MAP.get(s).copied().ok_or(strum::ParseError::VariantNotFound).or_else(|_| {
match Game::game() {
#[cfg(feature = "ck3")]
Game::Ck3 => Ck3Datatype::from_str(s).map(Datatype::Ck3),
#[cfg(feature = "vic3")]
Game::Vic3 => Vic3Datatype::from_str(s).map(Datatype::Vic3),
#[cfg(feature = "imperator")]
Game::Imperator => ImperatorDatatype::from_str(s).map(Datatype::Imperator),
#[cfg(feature = "eu5")]
Game::Eu5 => Eu5Datatype::from_str(s).map(Datatype::Eu5),
#[cfg(feature = "hoi4")]
Game::Hoi4 => Hoi4Datatype::from_str(s).map(Datatype::Hoi4),
}
})
}
}
impl Display for Datatype {
fn fmt(&self, f: &mut Formatter) -> Result<(), std::fmt::Error> {
match *self {
Datatype::Unknown => write!(f, "Unknown"),
Datatype::AnyScope => write!(f, "AnyScope"),
Datatype::CFixedPoint => write!(f, "CFixedPoint"),
Datatype::CString => write!(f, "CString"),
Datatype::CUTF8String => write!(f, "CUTF8String"),
Datatype::CVector2f => write!(f, "CVector2f"),
Datatype::CVector2i => write!(f, "CVector2i"),
Datatype::CVector3f => write!(f, "CVector3f"),
Datatype::CVector3i => write!(f, "CVector3i"),
Datatype::CVector4f => write!(f, "CVector4f"),
Datatype::CVector4i => write!(f, "CVector4i"),
Datatype::Date => write!(f, "Date"),
Datatype::Scope => write!(f, "Scope"),
Datatype::TopScope => write!(f, "TopScope"),
Datatype::bool => write!(f, "bool"),
Datatype::double => write!(f, "double"),
Datatype::float => write!(f, "float"),
Datatype::int16 => write!(f, "int16"),
Datatype::int32 => write!(f, "int32"),
Datatype::int64 => write!(f, "int64"),
Datatype::int8 => write!(f, "int8"),
Datatype::uint16 => write!(f, "uint16"),
Datatype::uint32 => write!(f, "uint32"),
Datatype::uint64 => write!(f, "uint64"),
Datatype::uint8 => write!(f, "uint8"),
Datatype::void => write!(f, "void"),
#[cfg(feature = "ck3")]
Datatype::Ck3(dt) => dt.fmt(f),
#[cfg(feature = "vic3")]
Datatype::Vic3(dt) => dt.fmt(f),
#[cfg(feature = "imperator")]
Datatype::Imperator(dt) => dt.fmt(f),
#[cfg(feature = "eu5")]
Datatype::Eu5(dt) => dt.fmt(f),
#[cfg(feature = "hoi4")]
Datatype::Hoi4(dt) => dt.fmt(f),
}
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub enum Arg {
#[cfg(feature = "jomini")]
DType(Datatype),
#[cfg(feature = "jomini")]
IType(Item),
#[allow(dead_code)]
Choice(&'static [&'static str]),
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub enum Args {
Unknown,
Args(&'static [Arg]),
}
#[cfg(feature = "ck3")]
pub use crate::ck3::datafunctions::*;
#[cfg(feature = "eu5")]
pub use crate::eu5::datafunctions::*;
#[cfg(feature = "hoi4")]
pub use crate::hoi4::datafunctions::*;
#[cfg(feature = "imperator")]
pub use crate::imperator::datafunctions::*;
#[cfg(feature = "vic3")]
pub use crate::vic3::datafunctions::*;