pub struct ProfileRulePack { /* private fields */ }Expand description
A profile/MIG rule pack that can be plugged into ValidationContext.
Implementations§
Source§impl ProfileRulePack
impl ProfileRulePack
Sourcepub fn message_types(&self) -> impl Iterator<Item = &str>
pub fn message_types(&self) -> impl Iterator<Item = &str>
Return the message types this pack is scoped to.
Sourcepub fn rule_count(&self) -> usize
pub fn rule_count(&self) -> usize
Return the number of rules in this pack.
Sourcepub fn rule_ids(&self) -> impl Iterator<Item = &str>
pub fn rule_ids(&self) -> impl Iterator<Item = &str>
Iterate over the stable identifiers of all named rules in this pack.
Anonymous rules (added without an id) are skipped.
Sourcepub fn release(&self) -> Option<&str>
pub fn release(&self) -> Option<&str>
Return the association-assigned release code this pack is bound to, if any.
None means the pack applies to messages of any association code.
Sourcepub fn for_message_type(self, message_type: impl Into<String>) -> Self
pub fn for_message_type(self, message_type: impl Into<String>) -> Self
Restrict this pack to one or more EDIFACT message types from the UNH segment.
When a pack has one or more message-type restrictions, its rules are only evaluated
against messages whose UNH element 1, component 0 matches one of the registered
types (e.g. "ORDERS", "INVOIC").
§Silent-skip behaviour
If the input segments do not contain a UNH segment, or if the UNH message-type
element is absent, the pack will silently skip all rules rather than returning an
error. This is intentional: without a readable message type the pack cannot
determine whether its rules apply, so it errs on the side of no false positives.
If you need a hard failure on a missing UNH, add a dedicated ProfileRule that
checks for the segment’s presence before other rules run.
Sourcepub fn for_release(self, release: impl Into<String>) -> Self
pub fn for_release(self, release: impl Into<String>) -> Self
Bind this pack to a specific association-assigned code (DE 0057).
When a release is set, rules are only evaluated against messages whose
UNH element 1, component 4 matches release exactly (e.g. "5.5.3a").
Packs with no bound release are universal — they run for every message
regardless of its association code.
§Example
let pack = ProfileRulePack::new("UTILMD-5.5.3a")
.for_message_type("UTILMD")
.for_release("5.5.3a");Sourcepub fn bail_on_first_error(self, bail: bool) -> Self
pub fn bail_on_first_error(self, bail: bool) -> Self
Stop evaluating rules in this pack after the first Error- or Critical-severity
finding.
Bail applies per pack, not globally — other packs in the
ValidationContext still run even when this pack bails early. This
avoids flooding validation reports with cascading false positives when a
mandatory segment is missing and all subsequent rules reference its content.
Sourcepub fn with_rule_fn<F>(self, rule: F) -> Selfwhere
F: for<'a> Fn(&[Segment<'a>], &ValidationRuleContext<'_>) -> Option<ValidationIssue> + Send + Sync + 'static,
pub fn with_rule_fn<F>(self, rule: F) -> Selfwhere
F: for<'a> Fn(&[Segment<'a>], &ValidationRuleContext<'_>) -> Option<ValidationIssue> + Send + Sync + 'static,
Add a context-aware rule closure.
The closure receives both the segment slice and a ValidationRuleContext
that may carry typed metadata injected at validation call time via
ValidationContext::validate_lenient_with.
For rules that do not need context, use with_stateless_rule_fn.
Sourcepub fn with_named_rule_fn<F>(self, id: impl Into<Arc<str>>, rule: F) -> Selfwhere
F: for<'a> Fn(&[Segment<'a>], &ValidationRuleContext<'_>) -> Option<ValidationIssue> + Send + Sync + 'static,
pub fn with_named_rule_fn<F>(self, id: impl Into<Arc<str>>, rule: F) -> Selfwhere
F: for<'a> Fn(&[Segment<'a>], &ValidationRuleContext<'_>) -> Option<ValidationIssue> + Send + Sync + 'static,
Add a context-aware rule closure with a stable identifier.
The id is used by merge_with_override to de-duplicate
rules across packs: if other has a rule with the same id, it replaces the
corresponding rule in self.
Sourcepub fn with_stateless_rule_fn<F>(self, rule: F) -> Self
pub fn with_stateless_rule_fn<F>(self, rule: F) -> Self
Add a context-free rule closure.
Convenience wrapper for rules that do not inspect the
ValidationRuleContext.
Sourcepub fn with_named_stateless_rule_fn<F>(
self,
id: impl Into<Arc<str>>,
rule: F,
) -> Self
pub fn with_named_stateless_rule_fn<F>( self, id: impl Into<Arc<str>>, rule: F, ) -> Self
Add a context-free rule closure with a stable identifier.
See with_named_rule_fn for override semantics.
Sourcepub fn with_rule(self, rule: impl ProfileRule + 'static) -> Self
pub fn with_rule(self, rule: impl ProfileRule + 'static) -> Self
Add a rule that implements ProfileRule.
Sourcepub fn with_named_rule(
self,
id: impl Into<Arc<str>>,
rule: impl ProfileRule + 'static,
) -> Self
pub fn with_named_rule( self, id: impl Into<Arc<str>>, rule: impl ProfileRule + 'static, ) -> Self
Add a named rule that implements ProfileRule.
See with_named_rule_fn for override semantics.
Sourcepub fn extend_from(self, base: &ProfileRulePack) -> Result<Self, EdifactError>
pub fn extend_from(self, base: &ProfileRulePack) -> Result<Self, EdifactError>
Prepend all rules from base to this pack.
Rules from base are shared (via Arc cloning) and run first.
Message-type restrictions from base are also merged. The resulting
release scope must be compatible with both packs: if one pack is scoped
to a release and the other is not, the scope is preserved; if both are
scoped, they must match.
§Example
let base = ProfileRulePack::new("MIG-UTILMD-BASE")
.with_stateless_rule_fn(/* mandatory segment rules */);
let ahb_11001 = ProfileRulePack::new("AHB-11001")
.extend_from(&base)
.with_stateless_rule_fn(/* 11001-specific rules */);Sourcepub fn merge(self, other: Self) -> Result<Self, EdifactError>
pub fn merge(self, other: Self) -> Result<Self, EdifactError>
Merge two packs into one combined pack.
Rules from self run before rules from other. If both packs contain
named rules with the same id, both run — use
merge_with_override to de-duplicate by id instead.
Release scoping follows the same compatibility rule as
extend_from.
Sourcepub fn merge_with_override(self, other: Self) -> Result<Self, EdifactError>
pub fn merge_with_override(self, other: Self) -> Result<Self, EdifactError>
Merge other into self, with other taking precedence for any rule
whose id already exists in self.
- Rules in
otherthat have a stable id matching a rule inselfreplace the rule at the same position inself. - Rules in
otherwith no id, or with an id not present inself, are appended toself. - Rules present only in
self(no matching override inother) are retained unchanged.
Message-type restrictions from other are merged into self.
Release scoping follows the same compatibility rule as
extend_from.
§Example
let base = ProfileRulePack::new("UTILMD-5.4")
.with_named_stateless_rule_fn("AHB-11001-BGM-M", |segs| { /* old rule */ None });
let delta = ProfileRulePack::new("UTILMD-5.5-delta")
.with_named_stateless_rule_fn("AHB-11001-BGM-M", |segs| { /* updated rule */ None });
// `result` runs the updated BGM-M rule only once:
let result = base.merge_with_override(delta);
assert_eq!(result.rule_count(), 1);Trait Implementations§
Source§impl Debug for ProfileRulePack
impl Debug for ProfileRulePack
Source§impl Validator for ProfileRulePack
impl Validator for ProfileRulePack
Source§fn validate_batch(
&self,
segments: &[Segment<'_>],
report: &mut ValidationReport,
context: &ValidationRuleContext<'_>,
)
fn validate_batch( &self, segments: &[Segment<'_>], report: &mut ValidationReport, context: &ValidationRuleContext<'_>, )
report. Read moreSource§fn set_message_type(&mut self, _message_type: Option<&str>)
fn set_message_type(&mut self, _message_type: Option<&str>)
Auto Trait Implementations§
impl !RefUnwindSafe for ProfileRulePack
impl !UnwindSafe for ProfileRulePack
impl Freeze for ProfileRulePack
impl Send for ProfileRulePack
impl Sync for ProfileRulePack
impl Unpin for ProfileRulePack
impl UnsafeUnpin for ProfileRulePack
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