pub struct ValidationContext { /* private fields */ }Expand description
Runtime validation context for progressive layered validation.
§Architecture
edifact-rs validation is organized into four independent layers, each
responsible for a distinct class of checks. All layers run against the same
segment slice; their issues are collected into a single ValidationReport.
| Layer | ValidationLayer variant | Default | Type |
|---|---|---|---|
| Envelope | Envelope | disabled | EnvelopeValidator |
| Structure | Structure | enabled | external (e.g. DirectoryValidator) |
| Code-list | CodeList | enabled | external |
| Profile | Profile | enabled | ProfileRulePack / Arc<ProfileRulePack> |
Validators are run in registration order within each enabled layer. Layers themselves have no enforced ordering beyond the order in which they are added via the builder.
§Envelope layer
Checks UNB/UNH/UNT/UNZ structural invariants: presence, message
count, and segment count. Enabled by calling
ValidationContextBuilder::with_envelope_validation. When enabled, the
envelope segments (UNB, UNZ, UNG, UNE) are excluded from the slice
passed to validators in subsequent layers.
§Structure layer
Validates segment presence, order, and arity against an EDIFACT directory.
Implemented by DirectoryValidator (registered as a Structure-layer
validator via ValidationContextBuilder::with_validator).
§Code-list layer
Validates DE values against EDIFACT code lists from the directory. Also
implemented by DirectoryValidator.
§Profile layer
Applies downstream business rules (BDEW AHB / MIG rules, custom constraints)
via ProfileRulePack. A pack can be scoped to specific EDIFACT message
types (for_message_type) and association-assigned codes (for_release).
§Group-aware validation
Validators that implement Validator::validate_group_batch can additionally
enforce rules scoped to specific segment groups (e.g. “DTM must appear in every
SG5 occurrence”). Call validate_lenient_grouped with a pre-built
SegmentGroupIndexed tree to activate both the flat and group passes.
§Example — building a context
use std::sync::{Arc, LazyLock};
use edifact_rs::{ProfileRulePack, ValidationContext, ValidationLayer};
static ORDERS_PACK: LazyLock<Arc<ProfileRulePack>> = LazyLock::new(|| {
Arc::new(
ProfileRulePack::new("ORDERS-MIG-5.5")
.for_message_type("ORDERS")
.require_segment("BGM", "MIG-BGM-M")
.require_segment_in_group("SG2", "NAD", "SG2-NAD-M"),
)
});
let ctx = ValidationContext::builder()
.with_envelope_validation()
.with_profile_pack_arc(Arc::clone(&*ORDERS_PACK))
.build();
let report = ctx.validate_lenient(&segments);Implementations§
Source§impl ValidationContext
impl ValidationContext
Sourcepub fn builder() -> ValidationContextBuilder
pub fn builder() -> ValidationContextBuilder
Start building a validation context.
Sourcepub fn validate_lenient(&self, segments: &[Segment<'_>]) -> ValidationReport
pub fn validate_lenient(&self, segments: &[Segment<'_>]) -> ValidationReport
Execute validators in lenient mode for enabled layers.
Sourcepub fn validate_lenient_grouped(
&self,
root: &SegmentGroupIndexed,
segments: &[Segment<'_>],
) -> ValidationReport
pub fn validate_lenient_grouped( &self, root: &SegmentGroupIndexed, segments: &[Segment<'_>], ) -> ValidationReport
Execute flat + group-aware validators in lenient mode.
This method runs the full flat validation pass (same as
validate_lenient) and then runs the
group-aware pass by calling Validator::validate_group_batch on every
validator. Validators without group rules treat validate_group_batch
as a no-op, so this is safe to call for any context.
§When to use
Use this method when you have already grouped your segments with
group_segments_indexed or
group_owned_segments_indexed and
want group-presence or cross-group rules (via
ProfileRulePack::with_scoped_group_rule_fn)
to fire.
§Example
use edifact_rs::{group_segments_indexed, ValidationContext};
use edifact_rs::group::GroupDef;
static SCHEMA: &[GroupDef] = &[
GroupDef { name: "SG5", trigger: "LOC", children: &[] },
];
let tree = group_segments_indexed(&segments, SCHEMA, "ROOT");
let pack = ProfileRulePack::new("AHB")
.require_segment_in_group("SG5", "DTM", "SG5-DTM-M");
let ctx = ValidationContext::builder().with_profile_pack(pack).build();
let report = ctx.validate_lenient_grouped(&tree, &segments);Sourcepub fn validate_strict_grouped(
&self,
root: &SegmentGroupIndexed,
segments: &[Segment<'_>],
) -> Result<ValidationReport, ValidationReport>
pub fn validate_strict_grouped( &self, root: &SegmentGroupIndexed, segments: &[Segment<'_>], ) -> Result<ValidationReport, ValidationReport>
Execute flat + group-aware validators in strict mode.
Sourcepub fn validate_lenient_grouped_owned(
&self,
root: &SegmentGroupIndexed,
segments: &[OwnedSegment],
) -> ValidationReport
pub fn validate_lenient_grouped_owned( &self, root: &SegmentGroupIndexed, segments: &[OwnedSegment], ) -> ValidationReport
Execute flat + group-aware validators against owned segments in lenient mode.
Sourcepub fn validate_strict_grouped_owned(
&self,
root: &SegmentGroupIndexed,
segments: &[OwnedSegment],
) -> Result<ValidationReport, ValidationReport>
pub fn validate_strict_grouped_owned( &self, root: &SegmentGroupIndexed, segments: &[OwnedSegment], ) -> Result<ValidationReport, ValidationReport>
Execute flat + group-aware validators against owned segments in strict mode.
Sourcepub fn validate_lenient_with<T: Any + Send + Sync>(
&self,
segments: &[Segment<'_>],
value: &T,
) -> ValidationReport
pub fn validate_lenient_with<T: Any + Send + Sync>( &self, segments: &[Segment<'_>], value: &T, ) -> ValidationReport
Execute validators with per-call typed metadata.
Sourcepub fn validate_strict(
&self,
segments: &[Segment<'_>],
) -> Result<ValidationReport, ValidationReport>
pub fn validate_strict( &self, segments: &[Segment<'_>], ) -> Result<ValidationReport, ValidationReport>
Execute validators in strict mode for enabled layers.
Sourcepub fn validate_strict_with<T: Any + Send + Sync>(
&self,
segments: &[Segment<'_>],
value: &T,
) -> Result<ValidationReport, ValidationReport>
pub fn validate_strict_with<T: Any + Send + Sync>( &self, segments: &[Segment<'_>], value: &T, ) -> Result<ValidationReport, ValidationReport>
Execute validators in strict mode with per-call typed metadata.
Sourcepub fn validate_lenient_owned(
&self,
segments: &[OwnedSegment],
) -> ValidationReport
pub fn validate_lenient_owned( &self, segments: &[OwnedSegment], ) -> ValidationReport
Execute validators in lenient mode against an owned-segment slice.
Sourcepub fn validate_strict_owned(
&self,
segments: &[OwnedSegment],
) -> Result<ValidationReport, ValidationReport>
pub fn validate_strict_owned( &self, segments: &[OwnedSegment], ) -> Result<ValidationReport, ValidationReport>
Execute validators in strict mode against an owned-segment slice.
Sourcepub fn message_type(&self) -> Option<&str>
pub fn message_type(&self) -> Option<&str>
Message type metadata associated with this context, if provided.
Sourcepub fn message_ref(&self) -> Option<&str>
pub fn message_ref(&self) -> Option<&str>
Message reference (UNH element 0) associated with this context, if provided.
Sourcepub fn fork_with_message_ref(&self, message_ref: impl Into<String>) -> Self
pub fn fork_with_message_ref(&self, message_ref: impl Into<String>) -> Self
Create a child context that inherits all rules and configuration from self
but is scoped to a specific message reference (UNH DE 0062).
Issues produced by the child context are automatically stamped with
message_ref, making it easy to correlate findings in a multi-message
interchange back to the originating UNH/UNT envelope.
§Example
let base_ctx = ValidationContext::builder()
.with_profile_pack(mig_pack)
.build();
for (ref_no, message_segments) in messages {
let child = base_ctx.fork_with_message_ref(&ref_no);
let report = child.validate_lenient(&message_segments);
}Auto Trait Implementations§
impl !RefUnwindSafe for ValidationContext
impl !UnwindSafe for ValidationContext
impl Freeze for ValidationContext
impl Send for ValidationContext
impl Sync for ValidationContext
impl Unpin for ValidationContext
impl UnsafeUnpin for ValidationContext
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<D> OwoColorize for D
impl<D> OwoColorize for D
Source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Source§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg or
a color-specific method, such as OwoColorize::green, Read moreSource§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg or
a color-specific method, such as OwoColorize::on_yellow, Read more