automapper-validation 0.9.0

AHB condition expression parsing, evaluation, and EDIFACT validation
Documentation
//! The condition evaluator for a message variant and format version.

use crate::eval::ConditionEvaluator;

/// Create the condition evaluator for `variant` (`"UTILMD_Strom"`, `"MSCONS"`, …)
/// in format version `fv` (`"FV2604"`).
///
/// Returns `None` if no evaluator exists for the combination. The arms list
/// every evaluator `generated/mod.rs` exports, aliases included, so a format
/// version answered by another version's evaluator resolves here too.
pub fn evaluator_for(variant: &str, fv: &str) -> Option<Box<dyn ConditionEvaluator>> {
    match (variant, fv) {
        // FV2504
        ("APERAK", "FV2504") => Some(Box::new(crate::AperakConditionEvaluatorFV2504::default())),
        ("COMDIS", "FV2504") => Some(Box::new(crate::ComdisConditionEvaluatorFV2504::default())),
        ("CONTRL", "FV2504") => Some(Box::new(crate::ContrlConditionEvaluatorFV2504::default())),
        ("IFTSTA", "FV2504") => Some(Box::new(crate::IftstaConditionEvaluatorFV2504::default())),
        ("INVOIC", "FV2504") => Some(Box::new(crate::InvoicConditionEvaluatorFV2504::default())),
        ("MSCONS", "FV2504") => Some(Box::new(crate::MsconsConditionEvaluatorFV2504::default())),
        ("ORDCHG", "FV2504") => Some(Box::new(crate::OrdchgConditionEvaluatorFV2504::default())),
        ("ORDERS", "FV2504") => Some(Box::new(crate::OrdersConditionEvaluatorFV2504::default())),
        ("ORDRSP", "FV2504") => Some(Box::new(crate::OrdrspConditionEvaluatorFV2504::default())),
        ("PARTIN", "FV2504") => Some(Box::new(crate::PartinConditionEvaluatorFV2504::default())),
        ("PRICAT", "FV2504") => Some(Box::new(crate::PricatConditionEvaluatorFV2504::default())),
        ("QUOTES", "FV2504") => Some(Box::new(crate::QuotesConditionEvaluatorFV2504::default())),
        ("REMADV", "FV2504") => Some(Box::new(crate::RemadvConditionEvaluatorFV2504::default())),
        ("REQOTE", "FV2504") => Some(Box::new(crate::ReqoteConditionEvaluatorFV2504::default())),
        ("UTILMD_Gas", "FV2504") => {
            Some(Box::new(crate::UtilmdGasConditionEvaluatorFV2504::default()))
        }
        ("UTILMD_Strom", "FV2504") => Some(Box::new(
            crate::UtilmdStromConditionEvaluatorFV2504::default(),
        )),
        ("UTILTS", "FV2504") => Some(Box::new(crate::UtiltsConditionEvaluatorFV2504::default())),
        // FV2510
        ("APERAK", "FV2510") => Some(Box::new(crate::AperakConditionEvaluatorFV2510::default())),
        ("COMDIS", "FV2510") => Some(Box::new(crate::ComdisConditionEvaluatorFV2510::default())),
        ("CONTRL", "FV2510") => Some(Box::new(crate::ContrlConditionEvaluatorFV2510::default())),
        ("IFTSTA", "FV2510") => Some(Box::new(crate::IftstaConditionEvaluatorFV2510::default())),
        ("INSRPT", "FV2510") => Some(Box::new(crate::InsrptConditionEvaluatorFV2510::default())),
        ("INVOIC", "FV2510") => Some(Box::new(crate::InvoicConditionEvaluatorFV2510::default())),
        ("MSCONS", "FV2510") => Some(Box::new(crate::MsconsConditionEvaluatorFV2510::default())),
        ("ORDCHG", "FV2510") => Some(Box::new(crate::OrdchgConditionEvaluatorFV2510::default())),
        ("ORDERS", "FV2510") => Some(Box::new(crate::OrdersConditionEvaluatorFV2510::default())),
        ("ORDRSP", "FV2510") => Some(Box::new(crate::OrdrspConditionEvaluatorFV2510::default())),
        ("PARTIN", "FV2510") => Some(Box::new(crate::PartinConditionEvaluatorFV2510::default())),
        ("PRICAT", "FV2510") => Some(Box::new(crate::PricatConditionEvaluatorFV2510::default())),
        ("QUOTES", "FV2510") => Some(Box::new(crate::QuotesConditionEvaluatorFV2510::default())),
        ("REMADV", "FV2510") => Some(Box::new(crate::RemadvConditionEvaluatorFV2510::default())),
        ("REQOTE", "FV2510") => Some(Box::new(crate::ReqoteConditionEvaluatorFV2510::default())),
        ("UTILMD_Gas", "FV2510") => {
            Some(Box::new(crate::UtilmdGasConditionEvaluatorFV2510::default()))
        }
        ("UTILMD_Strom", "FV2510") => Some(Box::new(
            crate::UtilmdStromConditionEvaluatorFV2510::default(),
        )),
        ("UTILTS", "FV2510") => Some(Box::new(crate::UtiltsConditionEvaluatorFV2510::default())),
        // FV2604
        ("APERAK", "FV2604") => Some(Box::new(crate::AperakConditionEvaluatorFV2604::default())),
        ("COMDIS", "FV2604") => Some(Box::new(crate::ComdisConditionEvaluatorFV2604::default())),
        ("CONTRL", "FV2604") => Some(Box::new(crate::ContrlConditionEvaluatorFV2604::default())),
        ("IFTSTA", "FV2604") => Some(Box::new(crate::IftstaConditionEvaluatorFV2604::default())),
        ("INSRPT", "FV2604") => Some(Box::new(crate::InsrptConditionEvaluatorFV2604::default())),
        ("INVOIC", "FV2604") => Some(Box::new(crate::InvoicConditionEvaluatorFV2604::default())),
        ("MSCONS", "FV2604") => Some(Box::new(crate::MsconsConditionEvaluatorFV2604::default())),
        ("ORDCHG", "FV2604") => Some(Box::new(crate::OrdchgConditionEvaluatorFV2604::default())),
        ("ORDERS", "FV2604") => Some(Box::new(crate::OrdersConditionEvaluatorFV2604::default())),
        ("ORDRSP", "FV2604") => Some(Box::new(crate::OrdrspConditionEvaluatorFV2604::default())),
        ("PARTIN", "FV2604") => Some(Box::new(crate::PartinConditionEvaluatorFV2604::default())),
        ("PRICAT", "FV2604") => Some(Box::new(crate::PricatConditionEvaluatorFV2604::default())),
        ("QUOTES", "FV2604") => Some(Box::new(crate::QuotesConditionEvaluatorFV2604::default())),
        ("REMADV", "FV2604") => Some(Box::new(crate::RemadvConditionEvaluatorFV2604::default())),
        ("REQOTE", "FV2604") => Some(Box::new(crate::ReqoteConditionEvaluatorFV2604::default())),
        ("UTILMD_Gas", "FV2604") => {
            Some(Box::new(crate::UtilmdGasConditionEvaluatorFV2604::default()))
        }
        ("UTILMD_Strom", "FV2604") => Some(Box::new(
            crate::UtilmdStromConditionEvaluatorFV2604::default(),
        )),
        ("UTILTS", "FV2604") => Some(Box::new(crate::UtiltsConditionEvaluatorFV2604::default())),
        // FV2610
        ("APERAK", "FV2610") => Some(Box::new(crate::AperakConditionEvaluatorFV2610::default())),
        ("COMDIS", "FV2610") => Some(Box::new(crate::ComdisConditionEvaluatorFV2610::default())),
        ("CONTRL", "FV2610") => Some(Box::new(crate::ContrlConditionEvaluatorFV2610::default())),
        ("IFTSTA", "FV2610") => Some(Box::new(crate::IftstaConditionEvaluatorFV2610::default())),
        ("INSRPT", "FV2610") => Some(Box::new(crate::InsrptConditionEvaluatorFV2610::default())),
        ("INVOIC", "FV2610") => Some(Box::new(crate::InvoicConditionEvaluatorFV2610::default())),
        ("MSCONS", "FV2610") => Some(Box::new(crate::MsconsConditionEvaluatorFV2610::default())),
        ("ORDCHG", "FV2610") => Some(Box::new(crate::OrdchgConditionEvaluatorFV2610::default())),
        ("ORDERS", "FV2610") => Some(Box::new(crate::OrdersConditionEvaluatorFV2610::default())),
        ("ORDRSP", "FV2610") => Some(Box::new(crate::OrdrspConditionEvaluatorFV2610::default())),
        ("PARTIN", "FV2610") => Some(Box::new(crate::PartinConditionEvaluatorFV2610::default())),
        ("PRICAT", "FV2610") => Some(Box::new(crate::PricatConditionEvaluatorFV2610::default())),
        ("QUOTES", "FV2610") => Some(Box::new(crate::QuotesConditionEvaluatorFV2610::default())),
        ("REMADV", "FV2610") => Some(Box::new(crate::RemadvConditionEvaluatorFV2610::default())),
        ("REQOTE", "FV2610") => Some(Box::new(crate::ReqoteConditionEvaluatorFV2610::default())),
        ("UTILMD_Gas", "FV2610") => {
            Some(Box::new(crate::UtilmdGasConditionEvaluatorFV2610::default()))
        }
        ("UTILMD_Strom", "FV2610") => Some(Box::new(
            crate::UtilmdStromConditionEvaluatorFV2610::default(),
        )),
        ("UTILTS", "FV2610") => Some(Box::new(crate::UtiltsConditionEvaluatorFV2610::default())),
        _ => None,
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn every_exported_evaluator_resolves_under_its_own_name() {
        for (variant, fv) in [
            ("UTILMD_Strom", "FV2504"),
            ("UTILMD_Strom", "FV2604"),
            ("UTILMD_Gas", "FV2610"),
            ("MSCONS", "FV2610"),
            ("INSRPT", "FV2510"),
        ] {
            let e = evaluator_for(variant, fv).unwrap_or_else(|| panic!("{variant} {fv}"));
            assert_eq!(e.message_type(), variant);
        }
        assert!(
            evaluator_for("INSRPT", "FV2504").is_none(),
            "INSRPT has no FV2504 AHB"
        );
        assert!(evaluator_for("NONEXISTENT", "FV2504").is_none());
    }
}