#![allow(clippy::style, clippy::complexity)]
#[allow(unused_imports)]
use crate::eval::format_validators::*;
use crate::eval::{ConditionEvaluator, ConditionResult, EvaluationContext};
use crate::generated::fv2604::MsconsConditionEvaluatorFV2604;
pub struct MsconsConditionEvaluatorFV2610 {
fallback: MsconsConditionEvaluatorFV2604,
}
impl Default for MsconsConditionEvaluatorFV2610 {
fn default() -> Self {
Self {
fallback: MsconsConditionEvaluatorFV2604::default(),
}
}
}
const FV2610_OVERRIDES: &[u32] = &[38, 119, 155];
impl ConditionEvaluator for MsconsConditionEvaluatorFV2610 {
fn message_type(&self) -> &str {
"MSCONS"
}
fn format_version(&self) -> &str {
"FV2610"
}
fn evaluate(&self, condition: u32, ctx: &EvaluationContext) -> ConditionResult {
match condition {
38 => self.evaluate_38(ctx),
119 => self.evaluate_119(ctx),
155 => self.evaluate_155(ctx),
other => self.fallback.evaluate(other, ctx),
}
}
fn is_external(&self, condition: u32) -> bool {
self.fallback.is_external(condition)
}
fn is_known(&self, condition: u32) -> bool {
FV2610_OVERRIDES.contains(&condition) || self.fallback.is_known(condition)
}
}
impl MsconsConditionEvaluatorFV2610 {
fn evaluate_38(&self, ctx: &EvaluationContext) -> ConditionResult {
let loc_segments = ctx.find_segments_with_qualifier("LOC", 0, "172");
match loc_segments.first() {
Some(loc) => match loc.elements.get(1).and_then(|e| e.first()) {
Some(v) if !v.is_empty() => validate_zahlpunkt(v),
_ => ConditionResult::False,
},
None => ConditionResult::False,
}
}
fn evaluate_119(&self, ctx: &EvaluationContext) -> ConditionResult {
let locs = ctx.find_segments_with_qualifier("LOC", 0, "172");
match locs.first() {
Some(loc) => match loc.elements.get(1).and_then(|e| e.first()) {
Some(v) if !v.is_empty() => validate_malo_id(v),
_ => ConditionResult::False,
},
None => ConditionResult::False,
}
}
fn evaluate_155(&self, ctx: &EvaluationContext) -> ConditionResult {
match ctx.find_segment("UNB") {
Some(unb) => {
let test_flag = unb.elements.get(10).and_then(|e| e.first());
ConditionResult::from(test_flag.is_some_and(|v| v == "1"))
}
None => ConditionResult::False,
}
}
}