Skip to main content

automapper_validation/
lib.rs

1//! AHB condition expression parsing, evaluation, and EDIFACT message validation.
2//!
3//! This crate provides three layers of functionality:
4//!
5//! 1. **Expression parsing** ([`expr`]): Parses AHB status strings like
6//!    `"Muss [182] ∧ [6] ∧ [570]"` into a [`ConditionExpr`] AST.
7//!
8//! 2. **Condition evaluation** ([`eval`]): Evaluates condition expressions
9//!    using a [`ConditionEvaluator`] trait with three-valued logic
10//!    (True/False/Unknown) for graceful handling of external conditions.
11//!
12//! 3. **Message validation** ([`validator`]): Validates EDIFACT messages
13//!    against AHB rules, producing a [`ValidationReport`] with typed issues.
14//!
15//! # Quick Start
16//!
17//! ```ignore
18//! use automapper_validation::expr::{ConditionParser, ConditionExpr};
19//! use automapper_validation::eval::{ConditionExprEvaluator, ConditionResult};
20//! use automapper_validation::validator::{EdifactValidator, ValidationLevel};
21//!
22//! // Parse a condition expression
23//! let expr = ConditionParser::parse("Muss [182] ∧ [152]").unwrap();
24//!
25//! // Validate pre-parsed segments against AHB workflow
26//! let validator = EdifactValidator::new(my_evaluator);
27//! let report = validator.validate(&segments, &workflow, &external, ValidationLevel::Full);
28//! ```
29
30pub mod display;
31pub mod error;
32pub mod eval;
33pub mod evaluator_factory;
34pub mod expr;
35pub mod generated;
36pub mod pipeline;
37pub mod validator;
38pub mod workflow_schema;
39
40// Re-export key types at crate root for convenience
41pub use display::{
42    Bo4eView, EdifactView, IssueDisplay, IssueNarrator, IssueView, TechnicalNarrator,
43};
44pub use error::{ParseError, ValidationError};
45pub use eval::{
46    binds_once, breaks_repetition_limit, counted_repetitions, once_per_transaction,
47    packages_allow_none, refuses_count, repetition_limits, requiredness,
48};
49pub use eval::{
50    presence_condition, presence_conditions, refuses_presence, AbsentTarget, AnswerCodeLists,
51    CodeListProvider, CompositeExternalProvider, ConditionEvaluator, ConditionExprEvaluator,
52    ConditionResult, CountryPostalCodeProvider, EvaluationContext, GroupNavigator,
53    KonfigurationenProvider, MapExternalProvider, MarketRole, MarketRoleProvider,
54    NoOpGroupNavigator, PresentTarget, Sector, SectorProvider,
55};
56pub use expr::{ConditionExpr, ConditionParser};
57pub use validator::{
58    build_validated_tree, validate_unt_segment_count, AhbGroupNode, AhbNode, EdifactValidator,
59    ErrorCodes, IssueKind, SegmentPosition, Severity, UnresolvedConditions, ValidatedTree,
60    ValidationCategory, ValidationIssue, ValidationLevel, ValidationReport,
61};
62
63// Re-export AHB workflow types for callers
64pub use evaluator_factory::evaluator_for;
65pub use pipeline::{
66    validate_edifact_message, validate_edifact_message_reporting_segments,
67    validate_edifact_message_with_structure,
68};
69pub use validator::validate::{AhbCodeRule, AhbFieldRule, AhbWorkflow};
70pub use workflow_schema::ahb_workflow_from_pid_schema;
71
72// Re-export generated evaluators
73pub use generated::*;
74
75// `IssueKind::StructureDiagnostic`'s `kind` field is this type, so a
76// dependant matching on `IssueKind` needs it without adding its own
77// version-pinned dependency on `mig-assembly`.
78pub use mig_assembly::StructureDiagnosticKind;