use df_ls_core::{Reference, ReferenceTo};
use df_ls_diagnostics::DiagnosticsInfo;
use df_ls_syntax_analysis::{Token, TokenDeserialize, TryFromArgumentGroup};
use serde::{Deserialize, Serialize};
use crate::{CreatureToken, PlantToken};
#[derive(Serialize, Deserialize, Clone, Debug, TokenDeserialize, PartialEq, Eq)]
#[token_de(enum_value)]
pub enum SingularOrPluralEnum {
#[token_de(token = "SINGULAR")]
Singular,
#[token_de(token = "PLURAL")]
Plural,
}
impl Default for SingularOrPluralEnum {
fn default() -> Self {
Self::Singular
}
}
#[derive(Serialize, Deserialize, Clone, Debug, TokenDeserialize, PartialEq, Eq)]
#[token_de(enum_value)]
pub enum AlertOrPeacefulIntermittentEnum {
#[token_de(token = "ALERT")]
Alert,
#[token_de(token = "PEACEFUL_INTERMITTENT")]
PeacefulIntermittent,
}
impl Default for AlertOrPeacefulIntermittentEnum {
fn default() -> Self {
Self::Alert
}
}
#[derive(Serialize, Deserialize, Clone, Debug, TokenDeserialize, PartialEq, Eq)]
#[token_de(enum_value)]
pub enum VocalizationEnum {
#[token_de(token = "VOCALIZATION")]
Vocalization,
}
impl Default for VocalizationEnum {
fn default() -> Self {
Self::Vocalization
}
}
#[derive(Serialize, Deserialize, Clone, Debug, TokenDeserialize, PartialEq, Eq)]
#[token_de(enum_value)]
pub enum TissueModifierEnum {
#[token_de(token = "LENGTH")]
Length,
#[token_de(token = "DENSE")]
Dense,
#[token_de(token = "HIGH_POSITION")]
HighPosition,
#[token_de(token = "CURLY")]
Curly,
#[token_de(token = "GREASY")]
Greasy,
#[token_de(token = "WRINKLY")]
Wrinkly,
}
impl Default for TissueModifierEnum {
fn default() -> Self {
Self::Length
}
}
#[derive(Serialize, Deserialize, Clone, Debug, TokenDeserialize, PartialEq, Eq)]
#[token_de(enum_value)]
pub enum AppGeneticModelEnum {
#[token_de(token = "DOMINANT_MORE")]
DominantMore,
#[token_de(token = "DOMINANT_LESS")]
DominantLess,
#[token_de(token = "MIX")]
Mix,
}
impl Default for AppGeneticModelEnum {
fn default() -> Self {
Self::DominantMore
}
}
#[derive(Serialize, Deserialize, Clone, Debug, TokenDeserialize, PartialEq, Eq)]
#[token_de(enum_value)]
pub enum SecretionTriggerEnum {
#[token_de(token = "CONTINUOUS")]
Continuous,
#[token_de(token = "EXERTION")]
Exertion,
#[token_de(token = "EXTREME_EMOTION")]
ExtremeEmotion,
}
impl Default for SecretionTriggerEnum {
fn default() -> Self {
Self::Continuous
}
}
#[derive(Serialize, Deserialize, Clone, Debug, TokenDeserialize, PartialEq, Eq)]
#[token_de(enum_value)]
pub enum LairCharacteristicEnum {
#[token_de(token = "HAS_DOORS")]
HasDoors,
}
impl Default for LairCharacteristicEnum {
fn default() -> Self {
Self::HasDoors
}
}
#[derive(Serialize, Deserialize, Clone, Debug, TokenDeserialize, PartialEq, Eq)]
#[token_de(enum_value)]
pub enum LairTypeEnum {
#[token_de(token = "SIMPLE_BURROW")]
SimpleBurrow,
#[token_de(token = "SIMPLE_MOUND")]
SimpleMound,
#[token_de(token = "WILDERNESS_LOCATION")]
WildernessLocation,
#[token_de(token = "SHRINE")]
Shrine,
#[token_de(token = "LABYRINTH")]
Labyrinth,
}
impl Default for LairTypeEnum {
fn default() -> Self {
Self::SimpleBurrow
}
}
#[derive(Serialize, Deserialize, Clone, Debug, TokenDeserialize, PartialEq, Eq)]
#[token_de(enum_value)]
pub enum TestAllEnum {
#[token_de(token = "TEST_ALL")]
TestAll,
}
impl Default for TestAllEnum {
fn default() -> Self {
Self::TestAll
}
}
#[derive(Serialize, Deserialize, Clone, Debug, TokenDeserialize, PartialEq, Eq)]
#[token_de(enum_value)]
pub enum HabitTypeEnum {
#[token_de(token = "COLLECT_TROPHIES")]
CollectTrophies,
#[token_de(token = "COOK_PEOPLE")]
CookPeople,
#[token_de(token = "COOK_VERMIN")]
CookVermin,
#[token_de(token = "GRIND_VERMIN")]
GrindVermin,
#[token_de(token = "COOK_BLOOD")]
CookBlood,
#[token_de(token = "GRIND_BONE_MEAL")]
GrindBoneMeal,
#[token_de(token = "EAT_BONE_PORRIDGE")]
EatBonePorridge,
#[token_de(token = "USE_ANY_MELEE_WEAPON")]
UseAnyMeleeWeapon,
#[token_de(token = "GIANT_NEST")]
GiantNest,
#[token_de(token = "COLLECT_WEALTH")]
CollectWealth,
}
impl Default for HabitTypeEnum {
fn default() -> Self {
Self::CollectTrophies
}
}
#[derive(Serialize, Deserialize, Clone, Debug, TokenDeserialize, PartialEq, Eq)]
#[token_de(enum_value)]
pub enum AnyHardStoneEnum {
#[token_de(token = "ANY_HARD_STONE")]
AnyHardStone,
}
impl Default for AnyHardStoneEnum {
fn default() -> Self {
Self::AnyHardStone
}
}
#[derive(Serialize, Deserialize, Clone, Debug, TokenDeserialize, PartialEq, Eq)]
#[token_de(enum_value)]
pub enum RootEnum {
#[token_de(token = "ROOT")]
Root,
}
impl Default for RootEnum {
fn default() -> Self {
Self::Root
}
}
#[derive(Serialize, Deserialize, Clone, Debug, TokenDeserialize, PartialEq, Eq)]
#[token_de(enum_value)]
pub enum TimescaleEnum {
#[token_de(token = "DAILY")]
Daily,
#[token_de(token = "YEARLY")]
Yearly,
}
impl Default for TimescaleEnum {
fn default() -> Self {
Self::Daily
}
}
#[derive(Serialize, Deserialize, Clone, Debug, TokenDeserialize, PartialEq, Eq)]
#[token_de(enum_value)]
pub enum NoEndEnum {
#[token_de(token = "NO_END")]
NoEnd,
}
impl Default for NoEndEnum {
fn default() -> Self {
Self::NoEnd
}
}
#[derive(Serialize, Deserialize, Clone, Debug, TokenDeserialize, PartialEq, Eq)]
#[token_de(enum_value)]
pub enum NormalEnum {
#[token_de(token = "NORMAL")]
Normal,
}
impl Default for NormalEnum {
fn default() -> Self {
Self::Normal
}
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
pub enum PlantOrCreatureTokenArg {
Plant(ReferenceTo<PlantToken>),
Creature(ReferenceTo<CreatureToken>),
}
impl Default for PlantOrCreatureTokenArg {
fn default() -> Self {
Self::Plant(ReferenceTo::new(String::default()))
}
}
df_ls_syntax_analysis::token_deserialize_unary_token!(PlantOrCreatureTokenArg);
impl TryFromArgumentGroup for PlantOrCreatureTokenArg {
fn try_from_argument_group(
token: &mut Token,
source: &str,
diagnostics: &mut DiagnosticsInfo,
add_diagnostics_on_err: bool,
) -> Result<Self, ()> {
let arg0 = match token.get_current_arg() {
Ok(arg) => Ok(arg.clone()),
Err(err) => Err(err),
};
let reference_arg0 =
Reference::try_from_argument_group(token, source, diagnostics, add_diagnostics_on_err)?;
let plant_or_creature = match reference_arg0.0.as_ref() {
"PLANT" => {
let plant_reference = ReferenceTo::<PlantToken>::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
PlantOrCreatureTokenArg::Plant(plant_reference)
}
"CREATURE" => {
let creature_reference = ReferenceTo::<CreatureToken>::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
PlantOrCreatureTokenArg::Creature(creature_reference)
}
_ => {
Self::diagnostics_wrong_enum_type(
&arg0?,
vec!["PLANT", "CREATURE"],
source,
diagnostics,
add_diagnostics_on_err,
);
return Err(());
}
};
Ok(plant_or_creature)
}
}