Skip to main content

ValidationContext

Struct ValidationContext 

Source
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.

LayerValidationLayer variantDefaultType
EnvelopeEnvelopedisabledEnvelopeValidator
StructureStructureenabledexternal (e.g. DirectoryValidator)
Code-listCodeListenabledexternal
ProfileProfileenabledProfileRulePack / 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

Source

pub fn builder() -> ValidationContextBuilder

Start building a validation context.

Source

pub fn validate_lenient(&self, segments: &[Segment<'_>]) -> ValidationReport

Execute validators in lenient mode for enabled layers.

Source

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);
Source

pub fn validate_strict_grouped( &self, root: &SegmentGroupIndexed, segments: &[Segment<'_>], ) -> Result<ValidationReport, ValidationReport>

Execute flat + group-aware validators in strict mode.

Source

pub fn validate_lenient_grouped_owned( &self, root: &SegmentGroupIndexed, segments: &[OwnedSegment], ) -> ValidationReport

Execute flat + group-aware validators against owned segments in lenient mode.

Source

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.

Source

pub fn validate_lenient_with<T: Any + Send + Sync>( &self, segments: &[Segment<'_>], value: &T, ) -> ValidationReport

Execute validators with per-call typed metadata.

Source

pub fn validate_strict( &self, segments: &[Segment<'_>], ) -> Result<ValidationReport, ValidationReport>

Execute validators in strict mode for enabled layers.

Source

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.

Source

pub fn validate_lenient_owned( &self, segments: &[OwnedSegment], ) -> ValidationReport

Execute validators in lenient mode against an owned-segment slice.

Source

pub fn validate_strict_owned( &self, segments: &[OwnedSegment], ) -> Result<ValidationReport, ValidationReport>

Execute validators in strict mode against an owned-segment slice.

Source

pub fn message_type(&self) -> Option<&str>

Message type metadata associated with this context, if provided.

Source

pub fn message_ref(&self) -> Option<&str>

Message reference (UNH element 0) associated with this context, if provided.

Source

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§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<D> OwoColorize for D

Source§

fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>
where C: Color,

Set the foreground color generically Read more
Source§

fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>
where C: Color,

Set the background color generically. Read more
Source§

fn black(&self) -> FgColorDisplay<'_, Black, Self>

Change the foreground color to black
Source§

fn on_black(&self) -> BgColorDisplay<'_, Black, Self>

Change the background color to black
Source§

fn red(&self) -> FgColorDisplay<'_, Red, Self>

Change the foreground color to red
Source§

fn on_red(&self) -> BgColorDisplay<'_, Red, Self>

Change the background color to red
Source§

fn green(&self) -> FgColorDisplay<'_, Green, Self>

Change the foreground color to green
Source§

fn on_green(&self) -> BgColorDisplay<'_, Green, Self>

Change the background color to green
Source§

fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>

Change the foreground color to yellow
Source§

fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>

Change the background color to yellow
Source§

fn blue(&self) -> FgColorDisplay<'_, Blue, Self>

Change the foreground color to blue
Source§

fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>

Change the background color to blue
Source§

fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to magenta
Source§

fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to magenta
Source§

fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to purple
Source§

fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to purple
Source§

fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>

Change the foreground color to cyan
Source§

fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>

Change the background color to cyan
Source§

fn white(&self) -> FgColorDisplay<'_, White, Self>

Change the foreground color to white
Source§

fn on_white(&self) -> BgColorDisplay<'_, White, Self>

Change the background color to white
Source§

fn default_color(&self) -> FgColorDisplay<'_, Default, Self>

Change the foreground color to the terminal default
Source§

fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>

Change the background color to the terminal default
Source§

fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>

Change the foreground color to bright black
Source§

fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>

Change the background color to bright black
Source§

fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>

Change the foreground color to bright red
Source§

fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>

Change the background color to bright red
Source§

fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>

Change the foreground color to bright green
Source§

fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>

Change the background color to bright green
Source§

fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>

Change the foreground color to bright yellow
Source§

fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>

Change the background color to bright yellow
Source§

fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>

Change the foreground color to bright blue
Source§

fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>

Change the background color to bright blue
Source§

fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright magenta
Source§

fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright magenta
Source§

fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright purple
Source§

fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright purple
Source§

fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>

Change the foreground color to bright cyan
Source§

fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>

Change the background color to bright cyan
Source§

fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>

Change the foreground color to bright white
Source§

fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>

Change the background color to bright white
Source§

fn bold(&self) -> BoldDisplay<'_, Self>

Make the text bold
Source§

fn dimmed(&self) -> DimDisplay<'_, Self>

Make the text dim
Source§

fn italic(&self) -> ItalicDisplay<'_, Self>

Make the text italicized
Source§

fn underline(&self) -> UnderlineDisplay<'_, Self>

Make the text underlined
Make the text blink
Make the text blink (but fast!)
Source§

fn reversed(&self) -> ReversedDisplay<'_, Self>

Swap the foreground and background colors
Source§

fn hidden(&self) -> HiddenDisplay<'_, Self>

Hide the text
Source§

fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>

Cross out the text
Source§

fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the foreground color at runtime. Only use if you do not know which color will be used at compile-time. If the color is constant, use either OwoColorize::fg or a color-specific method, such as OwoColorize::green, Read more
Source§

fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the background color at runtime. Only use if you do not know what color to use at compile-time. If the color is constant, use either OwoColorize::bg or a color-specific method, such as OwoColorize::on_yellow, Read more
Source§

fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the foreground color to a specific RGB value.
Source§

fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the background color to a specific RGB value.
Source§

fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>

Sets the foreground color to an RGB value.
Source§

fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>

Sets the background color to an RGB value.
Source§

fn style(&self, style: Style) -> Styled<&Self>

Apply a runtime-determined style
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.