use crate::{
BodyAttributeEnum, BpCriteriaTokenArg, CasteFlagEnum, CreatureFlagEnum, CreatureToken,
FacetEnum, InteractionToken, PersonalityTraitEnum, SoulAttributeEnum,
SynTransmittionMethodEnum, TargetPropertyEnum,
};
use df_ls_core::{Reference, ReferenceTo};
use df_ls_diagnostics::{hash_map, DMExtraInfo, DiagnosticsInfo};
use df_ls_syntax_analysis::{Token, TokenDeserialize, TryFromArgumentGroup};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
pub enum CeBodyMatInteractionTokenArg {
SyndromeTag(SynTransmittionMethodEnum),
Interaction(ReferenceTo<InteractionToken>),
}
impl Default for CeBodyMatInteractionTokenArg {
fn default() -> Self {
Self::SyndromeTag(SynTransmittionMethodEnum::SynIngested)
}
}
df_ls_syntax_analysis::token_deserialize_unary_token!(CeBodyMatInteractionTokenArg);
impl TryFromArgumentGroup for CeBodyMatInteractionTokenArg {
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 ce_token_arg = match reference_arg0.0.as_ref() {
"SYNDROME_TAG" => {
let syndrome_tag = SynTransmittionMethodEnum::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
CeBodyMatInteractionTokenArg::SyndromeTag(syndrome_tag)
}
"INTERACTION" => {
let interaction = ReferenceTo::<InteractionToken>::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
CeBodyMatInteractionTokenArg::Interaction(interaction)
}
_ => {
Self::diagnostics_wrong_enum_type(
&arg0?,
vec!["SYNDROME_TAG", "INTERACTION"],
source,
diagnostics,
add_diagnostics_on_err,
);
return Err(());
}
};
Ok(ce_token_arg)
}
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
pub enum CeBodyTransformationTokenArg {
Creature((ReferenceTo<CreatureToken>, Reference)), CreatureFlag(CreatureFlagEnum),
ForbiddenCreatureFlag(CreatureFlagEnum),
CreatureCasteFlag(CasteFlagEnum),
ForbiddenCreatureCasteFlag(CasteFlagEnum),
HaveFastEffortlessGaitSpeed(u32),
AllSlowEffortlessGaitSpeed(u32),
}
impl Default for CeBodyTransformationTokenArg {
fn default() -> Self {
Self::Creature((
ReferenceTo::<CreatureToken>::default(),
Reference::default(),
))
}
}
df_ls_syntax_analysis::token_deserialize_unary_token!(CeBodyTransformationTokenArg);
impl TryFromArgumentGroup for CeBodyTransformationTokenArg {
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 ce_token_arg = match reference_arg0.0.as_ref() {
"CREATURE" => {
let creature = <(ReferenceTo<CreatureToken>, Reference)>::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
CeBodyTransformationTokenArg::Creature(creature)
}
"CREATURE_FLAG" => {
let creature_flag = CreatureFlagEnum::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
CeBodyTransformationTokenArg::CreatureFlag(creature_flag)
}
"FORBIDDEN_CREATURE_FLAG" => {
let forbidden_creature_flag = CreatureFlagEnum::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
CeBodyTransformationTokenArg::ForbiddenCreatureFlag(forbidden_creature_flag)
}
"CREATURE_CASTE_FLAG" => {
let creature_caste_flag = CasteFlagEnum::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
CeBodyTransformationTokenArg::CreatureCasteFlag(creature_caste_flag)
}
"FORBIDDEN_CREATURE_CASTE_FLAG" => {
let forbidden_creature_caste_flag = CasteFlagEnum::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
CeBodyTransformationTokenArg::ForbiddenCreatureCasteFlag(
forbidden_creature_caste_flag,
)
}
"HAVE_FAST_EFFORTLESS_GAIT_SPEED" => {
let have_fast_effortless_gait_speed = u32::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
CeBodyTransformationTokenArg::HaveFastEffortlessGaitSpeed(
have_fast_effortless_gait_speed,
)
}
"ALL_SLOW_EFFORTLESS_GAIT_SPEED" => {
let all_slow_effortless_gait_speed = u32::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
CeBodyTransformationTokenArg::HaveFastEffortlessGaitSpeed(
all_slow_effortless_gait_speed,
)
}
_ => {
Self::diagnostics_wrong_enum_type(
&arg0?,
vec![
"CREATURE",
"CREATURE_FLAG",
"FORBIDDEN_CREATURE_FLAG",
"CREATURE_CASTE_FLAG",
"FORBIDDEN_CREATURE_CASTE_FLAG",
"HAVE_FAST_EFFORTLESS_GAIT_SPEED",
"ALL_SLOW_EFFORTLESS_GAIT_SPEED",
],
source,
diagnostics,
add_diagnostics_on_err,
);
return Err(());
}
};
Ok(ce_token_arg)
}
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq)]
pub struct CeXTokenArg {
pub sev: Option<u32>,
pub prob: Option<u8>,
pub localized: Option<()>,
pub bp: Vec<(BpCriteriaTokenArg, Reference)>,
pub vascular_only: Option<()>,
pub muscular_only: Option<()>,
pub size_dilutes: Option<()>,
pub size_delays: Option<()>,
pub dwf_stretch: Option<u32>,
pub abrupt: Option<()>,
pub can_be_hidden: Option<()>,
pub resistable: Option<()>,
pub start: Option<u32>,
pub end: Option<u32>,
pub peak: Option<u32>,
}
df_ls_syntax_analysis::token_deserialize_unary_token!(CeXTokenArg);
impl TryFromArgumentGroup for CeXTokenArg {
fn try_from_argument_group(
token: &mut Token,
source: &str,
diagnostics: &mut DiagnosticsInfo,
add_diagnostics_on_err: bool,
) -> Result<Self, ()> {
let mut result = Self::default();
while let Some(arg) = token.clone().get_current_arg_opt() {
let arg0 = match token.get_current_arg() {
Ok(arg) => Ok(arg.clone()),
Err(err) => Err(err),
};
let next = Reference::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
let mut arg_is_duplicate: bool = false;
match next.0.as_ref() {
"SEV" => {
if result.sev.is_none() {
let sev = u32::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.sev = Some(sev);
} else {
arg_is_duplicate = true;
}
}
"PROB" => {
if result.prob.is_none() {
let prob = u8::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.prob = Some(prob);
} else {
arg_is_duplicate = true;
}
}
"LOCALIZED" => {
if result.localized.is_none() {
result.localized = Some(());
} else {
arg_is_duplicate = true;
}
}
"BP" => {
let body_part_target =
<(BpCriteriaTokenArg, Reference)>::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.bp.push(body_part_target);
}
"VASCULAR_ONLY" => {
if result.vascular_only.is_none() {
result.vascular_only = Some(());
} else {
arg_is_duplicate = true;
}
}
"MUSCULAR_ONLY" => {
if result.muscular_only.is_none() {
result.muscular_only = Some(());
} else {
arg_is_duplicate = true;
}
}
"SIZE_DILUTES" => {
if result.size_dilutes.is_none() {
result.size_dilutes = Some(());
} else {
arg_is_duplicate = true;
}
}
"SIZE_DELAYS" => {
if result.size_delays.is_none() {
result.size_delays = Some(());
} else {
arg_is_duplicate = true;
}
}
"DWF_STRETCH" => {
if result.dwf_stretch.is_none() {
let dwf_stretch = u32::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.dwf_stretch = Some(dwf_stretch);
} else {
arg_is_duplicate = true;
}
}
"ABRUPT" => {
if result.abrupt.is_none() {
result.abrupt = Some(());
} else {
arg_is_duplicate = true;
}
}
"CAN_BE_HIDDEN" => {
if result.can_be_hidden.is_none() {
result.can_be_hidden = Some(());
} else {
arg_is_duplicate = true;
}
}
"RESISTABLE" => {
if result.resistable.is_none() {
result.resistable = Some(());
} else {
arg_is_duplicate = true;
}
}
"START" => {
if result.start.is_none() {
let start = u32::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.start = Some(start);
} else {
arg_is_duplicate = true;
}
}
"END" => {
if result.end.is_none() {
let end = u32::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.end = Some(end);
} else {
arg_is_duplicate = true;
}
}
"PEAK" => {
if result.peak.is_none() {
let peak = u32::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.peak = Some(peak);
} else {
arg_is_duplicate = true;
}
}
_ => {
Self::diagnostics_wrong_enum_type(
&arg0?,
vec![
"SEV",
"PROB",
"LOCALIZED",
"BP",
"VASCULAR_ONLY",
"MUSCULAR_ONLY",
"SIZE_DILUTES",
"SIZE_DELAYS",
"DFW_STRETCH",
"ABRUPT",
"CAN_BE_HIDDEN",
"RESISTABLE",
"START",
"END",
"PEAK",
],
source,
diagnostics,
add_diagnostics_on_err,
);
return Err(());
}
};
if arg_is_duplicate {
diagnostics.add_message(
DMExtraInfo {
range: arg.node.get_range(),
message_template_data: hash_map! {
"token_name" => format!("`{}`", arg.value),
"parent_token" => format!("`{}`", token.get_argument(0).unwrap().value),
},
},
"duplicate_token_warn",
);
}
}
Ok(result)
}
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq)]
pub struct CeXNoTargetTokenArg {
pub sev: Option<u32>,
pub prob: Option<u8>,
pub size_dilutes: Option<()>,
pub size_delays: Option<()>,
pub dwf_stretch: Option<u32>,
pub abrupt: Option<()>,
pub can_be_hidden: Option<()>,
pub resistable: Option<()>,
pub start: Option<u32>,
pub end: Option<u32>,
pub peak: Option<u32>,
}
df_ls_syntax_analysis::token_deserialize_unary_token!(CeXNoTargetTokenArg);
impl TryFromArgumentGroup for CeXNoTargetTokenArg {
fn try_from_argument_group(
token: &mut Token,
source: &str,
diagnostics: &mut DiagnosticsInfo,
add_diagnostics_on_err: bool,
) -> Result<Self, ()> {
let mut result = Self::default();
while let Some(arg) = token.clone().get_current_arg_opt() {
let arg0 = match token.get_current_arg() {
Ok(arg) => Ok(arg.clone()),
Err(err) => Err(err),
};
let next = Reference::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
let mut arg_is_duplicate: bool = false;
match next.0.as_ref() {
"SEV" => {
if result.sev.is_none() {
let sev = u32::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.sev = Some(sev);
} else {
arg_is_duplicate = true;
}
}
"PROB" => {
if result.prob.is_none() {
let prob = u8::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.prob = Some(prob);
} else {
arg_is_duplicate = true;
}
}
"SIZE_DILUTES" => {
if result.size_dilutes.is_none() {
result.size_dilutes = Some(());
} else {
arg_is_duplicate = true;
}
}
"SIZE_DELAYS" => {
if result.size_delays.is_none() {
result.size_delays = Some(());
} else {
arg_is_duplicate = true;
}
}
"DWF_STRETCH" => {
if result.dwf_stretch.is_none() {
let dwf_stretch = u32::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.dwf_stretch = Some(dwf_stretch);
} else {
arg_is_duplicate = true;
}
}
"ABRUPT" => {
if result.abrupt.is_none() {
result.abrupt = Some(());
} else {
arg_is_duplicate = true;
}
}
"CAN_BE_HIDDEN" => {
if result.can_be_hidden.is_none() {
result.can_be_hidden = Some(());
} else {
arg_is_duplicate = true;
}
}
"RESISTABLE" => {
if result.resistable.is_none() {
result.resistable = Some(());
} else {
arg_is_duplicate = true;
}
}
"START" => {
if result.start.is_none() {
let start = u32::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.start = Some(start);
} else {
arg_is_duplicate = true;
}
}
"END" => {
if result.end.is_none() {
let end = u32::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.end = Some(end);
} else {
arg_is_duplicate = true;
}
}
"PEAK" => {
if result.peak.is_none() {
let peak = u32::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.peak = Some(peak);
} else {
arg_is_duplicate = true;
}
}
_ => {
Self::diagnostics_wrong_enum_type(
&arg0?,
vec![
"SEV",
"PROB",
"SIZE_DILUTES",
"SIZE_DELAYS",
"DFW_STRETCH",
"ABRUPT",
"CAN_BE_HIDDEN",
"RESISTABLE",
"START",
"END",
"PEAK",
],
source,
diagnostics,
add_diagnostics_on_err,
);
return Err(());
}
};
if arg_is_duplicate {
diagnostics.add_message(
DMExtraInfo {
range: arg.node.get_range(),
message_template_data: hash_map! {
"token_name" => format!("`{}`", arg.value),
"parent_token" => format!("`{}`", token.get_argument(0).unwrap().value),
},
},
"duplicate_token_warn",
);
}
}
Ok(result)
}
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq)]
pub struct CeXNoSevTokenArg {
pub prob: Option<u8>,
pub size_dilutes: Option<()>,
pub size_delays: Option<()>,
pub dwf_stretch: Option<u32>,
pub abrupt: Option<()>,
pub can_be_hidden: Option<()>,
pub resistable: Option<()>,
pub start: Option<u32>,
pub end: Option<u32>,
pub peak: Option<u32>,
}
df_ls_syntax_analysis::token_deserialize_unary_token!(CeXNoSevTokenArg);
impl TryFromArgumentGroup for CeXNoSevTokenArg {
fn try_from_argument_group(
token: &mut Token,
source: &str,
diagnostics: &mut DiagnosticsInfo,
add_diagnostics_on_err: bool,
) -> Result<Self, ()> {
let mut result = Self::default();
while let Some(arg) = token.clone().get_current_arg_opt() {
let arg0 = match token.get_current_arg() {
Ok(arg) => Ok(arg.clone()),
Err(err) => Err(err),
};
let next = Reference::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
let mut arg_is_duplicate: bool = false;
match next.0.as_ref() {
"PROB" => {
if result.prob.is_none() {
let prob = u8::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.prob = Some(prob);
} else {
arg_is_duplicate = true;
}
}
"SIZE_DILUTES" => {
if result.size_dilutes.is_none() {
result.size_dilutes = Some(());
} else {
arg_is_duplicate = true;
}
}
"SIZE_DELAYS" => {
if result.size_delays.is_none() {
result.size_delays = Some(());
} else {
arg_is_duplicate = true;
}
}
"DWF_STRETCH" => {
if result.dwf_stretch.is_none() {
let dwf_stretch = u32::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.dwf_stretch = Some(dwf_stretch);
} else {
arg_is_duplicate = true;
}
}
"ABRUPT" => {
if result.abrupt.is_none() {
result.abrupt = Some(());
} else {
arg_is_duplicate = true;
}
}
"CAN_BE_HIDDEN" => {
if result.can_be_hidden.is_none() {
result.can_be_hidden = Some(());
} else {
arg_is_duplicate = true;
}
}
"RESISTABLE" => {
if result.resistable.is_none() {
result.resistable = Some(());
} else {
arg_is_duplicate = true;
}
}
"START" => {
if result.start.is_none() {
let start = u32::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.start = Some(start);
} else {
arg_is_duplicate = true;
}
}
"END" => {
if result.end.is_none() {
let end = u32::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.end = Some(end);
} else {
arg_is_duplicate = true;
}
}
"PEAK" => {
if result.peak.is_none() {
let peak = u32::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.peak = Some(peak);
} else {
arg_is_duplicate = true;
}
}
_ => {
Self::diagnostics_wrong_enum_type(
&arg0?,
vec![
"PROB",
"SIZE_DILUTES",
"SIZE_DELAYS",
"DFW_STRETCH",
"ABRUPT",
"CAN_BE_HIDDEN",
"RESISTABLE",
"START",
"END",
"PEAK",
],
source,
diagnostics,
add_diagnostics_on_err,
);
return Err(());
}
};
if arg_is_duplicate {
diagnostics.add_message(
DMExtraInfo {
range: arg.node.get_range(),
message_template_data: hash_map! {
"token_name" => format!("`{}`", arg.value),
"parent_token" => format!("`{}`", token.get_argument(0).unwrap().value),
},
},
"duplicate_token_warn",
);
}
}
Ok(result)
}
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq)]
pub struct CeChangePersonalityTokenArg {
pub facets: Vec<(FacetEnum, PersonalityTraitEnum, i8)>,
pub general_cex: Option<CeXNoSevTokenArg>,
}
df_ls_syntax_analysis::token_deserialize_unary_token!(CeChangePersonalityTokenArg);
impl TryFromArgumentGroup for CeChangePersonalityTokenArg {
fn try_from_argument_group(
token: &mut Token,
source: &str,
diagnostics: &mut DiagnosticsInfo,
add_diagnostics_on_err: bool,
) -> Result<Self, ()> {
let mut result = Self::default();
loop {
if token.get_current_arg_opt().is_none() {
break;
}
let mut token_clone = token.clone();
let next = Reference::try_from_argument_group(
&mut token_clone,
source,
diagnostics,
add_diagnostics_on_err,
)?;
match next.0.as_ref() {
"FACET" => {
let facet = <(FacetEnum, PersonalityTraitEnum, i8)>::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.facets.push(facet);
}
_ => {
let general_cex = <CeXNoSevTokenArg>::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.general_cex = Some(general_cex);
break;
}
};
}
Ok(result)
}
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq)]
pub struct CeTagsTokenArg {
pub tags: Vec<TargetPropertyEnum>,
pub general_cex: Option<CeXNoSevTokenArg>,
}
df_ls_syntax_analysis::token_deserialize_unary_token!(CeTagsTokenArg);
impl TryFromArgumentGroup for CeTagsTokenArg {
fn try_from_argument_group(
token: &mut Token,
source: &str,
diagnostics: &mut DiagnosticsInfo,
add_diagnostics_on_err: bool,
) -> Result<Self, ()> {
let mut result = Self::default();
loop {
if token.get_current_arg_opt().is_none() {
break;
}
let mut token_clone = token.clone();
let next = Reference::try_from_argument_group(
&mut token_clone,
source,
diagnostics,
add_diagnostics_on_err,
)?;
match next.0.as_ref() {
"PROB" | "SIZE_DILUTES" | "SIZE_DELAYS" | "DFW_STRETCH" | "ABRUPT"
| "CAN_BE_HIDDEN" | "RESISTABLE" | "START" | "END" | "PEAK" => {
let general_cex = <CeXNoSevTokenArg>::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.general_cex = Some(general_cex);
break;
}
_ => {
let tag = TargetPropertyEnum::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.tags.push(tag);
}
};
}
Ok(result)
}
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq)]
pub struct CePhysAttChangeTokenArg {
pub body_attributes: Vec<(BodyAttributeEnum, u32, u32)>,
pub general_cex: Option<CeXNoSevTokenArg>,
}
df_ls_syntax_analysis::token_deserialize_unary_token!(CePhysAttChangeTokenArg);
impl TryFromArgumentGroup for CePhysAttChangeTokenArg {
fn try_from_argument_group(
token: &mut Token,
source: &str,
diagnostics: &mut DiagnosticsInfo,
add_diagnostics_on_err: bool,
) -> Result<Self, ()> {
let mut result = Self::default();
loop {
if token.get_current_arg_opt().is_none() {
break;
}
let mut token_clone = token.clone();
let next = Reference::try_from_argument_group(
&mut token_clone,
source,
diagnostics,
add_diagnostics_on_err,
)?;
match next.0.as_ref() {
"PROB" | "SIZE_DILUTES" | "SIZE_DELAYS" | "DFW_STRETCH" | "ABRUPT"
| "CAN_BE_HIDDEN" | "RESISTABLE" | "START" | "END" | "PEAK" => {
let general_cex = <CeXNoSevTokenArg>::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.general_cex = Some(general_cex);
break;
}
_ => {
let body_attribute = <(BodyAttributeEnum, u32, u32)>::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.body_attributes.push(body_attribute);
}
};
}
Ok(result)
}
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq)]
pub struct CeMentAttChangeTokenArg {
pub soul_attributes: Vec<(SoulAttributeEnum, u32, u32)>,
pub general_cex: Option<CeXNoSevTokenArg>,
}
df_ls_syntax_analysis::token_deserialize_unary_token!(CeMentAttChangeTokenArg);
impl TryFromArgumentGroup for CeMentAttChangeTokenArg {
fn try_from_argument_group(
token: &mut Token,
source: &str,
diagnostics: &mut DiagnosticsInfo,
add_diagnostics_on_err: bool,
) -> Result<Self, ()> {
let mut result = Self::default();
loop {
if token.get_current_arg_opt().is_none() {
break;
}
let mut token_clone = token.clone();
let next = Reference::try_from_argument_group(
&mut token_clone,
source,
diagnostics,
add_diagnostics_on_err,
)?;
match next.0.as_ref() {
"PROB" | "SIZE_DILUTES" | "SIZE_DELAYS" | "DFW_STRETCH" | "ABRUPT"
| "CAN_BE_HIDDEN" | "RESISTABLE" | "START" | "END" | "PEAK" => {
let general_cex = <CeXNoSevTokenArg>::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.general_cex = Some(general_cex);
break;
}
_ => {
let soul_attribute = <(SoulAttributeEnum, u32, u32)>::try_from_argument_group(
token,
source,
diagnostics,
add_diagnostics_on_err,
)?;
result.soul_attributes.push(soul_attribute);
}
};
}
Ok(result)
}
}