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 named_rule_count(&self) -> usize
pub fn named_rule_count(&self) -> usize
Return the number of named rules (those with a stable identifier).
Sourcepub fn anonymous_rule_count(&self) -> usize
pub fn anonymous_rule_count(&self) -> usize
Return the number of anonymous rules (those without a stable identifier).
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.
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.
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.
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).
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.
Sourcepub fn with_rule_fn<F>(self, rule: F) -> Selfwhere
F: for<'a> Fn(&[Segment<'a>], &ValidationRuleContext<'_>, &mut Vec<ValidationIssue>) + Send + Sync + 'static,
pub fn with_rule_fn<F>(self, rule: F) -> Selfwhere
F: for<'a> Fn(&[Segment<'a>], &ValidationRuleContext<'_>, &mut Vec<ValidationIssue>) + Send + Sync + 'static,
Add a context-aware rule closure.
Sourcepub fn with_named_rule_fn<F>(self, id: impl Into<Arc<str>>, rule: F) -> Selfwhere
F: for<'a> Fn(&[Segment<'a>], &ValidationRuleContext<'_>, &mut Vec<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<'_>, &mut Vec<ValidationIssue>) + Send + Sync + 'static,
Add a context-aware rule closure with a stable identifier.
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.
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.
Sourcepub fn forbid_segment(
self,
tag: &'static str,
rule_id: impl Into<Arc<str>>,
) -> Self
pub fn forbid_segment( self, tag: &'static str, rule_id: impl Into<Arc<str>>, ) -> Self
Add a rule that asserts segment tag does not appear.
Emits an Error-severity issue for each occurrence found.
Sourcepub fn require_qualifier(
self,
tag: &'static str,
element: u8,
component: u8,
qualifier: &'static str,
rule_id: impl Into<Arc<str>>,
) -> Self
pub fn require_qualifier( self, tag: &'static str, element: u8, component: u8, qualifier: &'static str, rule_id: impl Into<Arc<str>>, ) -> Self
Add a rule that asserts data element de_qualifier at (element, component) equals
qualifier for every occurrence of tag.
Sourcepub fn with_group_rule_fn<F>(self, rule: F) -> Selfwhere
F: Fn(&SegmentGroupIndexed, &[Segment<'_>], &ValidationRuleContext<'_>, &mut Vec<ValidationIssue>) + Send + Sync + 'static,
pub fn with_group_rule_fn<F>(self, rule: F) -> Selfwhere
F: Fn(&SegmentGroupIndexed, &[Segment<'_>], &ValidationRuleContext<'_>, &mut Vec<ValidationIssue>) + Send + Sync + 'static,
Add a group-aware rule closure that fires for every group node in the DFS traversal of the segment-group tree.
The closure receives:
group: &SegmentGroupIndexed— the current tree node (withdefinition,total_span,children).group_segments: &[Segment<'_>]— all segments in this group’s subtree (all_segments[group.total_span.clone()]).context: &ValidationRuleContext<'_>— per-call metadata and message info.issues: &mut Vec<ValidationIssue>— push violations here.
§Group-name scoping
Use with_scoped_group_rule_fn when you
only want the rule to fire for a specific group definition (e.g. "SG5").
Sourcepub fn with_named_group_rule_fn<F>(
self,
id: impl Into<Arc<str>>,
rule: F,
) -> Selfwhere
F: Fn(&SegmentGroupIndexed, &[Segment<'_>], &ValidationRuleContext<'_>, &mut Vec<ValidationIssue>) + Send + Sync + 'static,
pub fn with_named_group_rule_fn<F>(
self,
id: impl Into<Arc<str>>,
rule: F,
) -> Selfwhere
F: Fn(&SegmentGroupIndexed, &[Segment<'_>], &ValidationRuleContext<'_>, &mut Vec<ValidationIssue>) + Send + Sync + 'static,
Add a named group-aware rule closure that fires for every group node.
Sourcepub fn with_scoped_group_rule_fn<F>(
self,
group_scope: &'static str,
id: impl Into<Arc<str>>,
rule: F,
) -> Selfwhere
F: Fn(&SegmentGroupIndexed, &[Segment<'_>], &ValidationRuleContext<'_>, &mut Vec<ValidationIssue>) + Send + Sync + 'static,
pub fn with_scoped_group_rule_fn<F>(
self,
group_scope: &'static str,
id: impl Into<Arc<str>>,
rule: F,
) -> Selfwhere
F: Fn(&SegmentGroupIndexed, &[Segment<'_>], &ValidationRuleContext<'_>, &mut Vec<ValidationIssue>) + Send + Sync + 'static,
Add a named group-aware rule closure scoped to a specific group definition.
The closure is called only when the DFS traversal enters a group whose
SegmentGroupIndexed::definition equals group_scope (e.g. "SG5").
§Example
let pack = ProfileRulePack::new("AHB-MSCONS")
.with_scoped_group_rule_fn("SG5", "SG5-CAV-M", |_group, segs, _ctx, issues| {
if !segs.iter().any(|s| s.tag == "CAV") {
issues.push(
ValidationIssue::new(ValidationSeverity::Error, "CAV missing in SG5")
.with_segment("CAV")
.with_rule_id("SG5-CAV-M"),
);
}
});Sourcepub fn require_segment_in_group(
self,
group_scope: &'static str,
tag: &'static str,
rule_id: impl Into<Arc<str>>,
) -> Self
pub fn require_segment_in_group( self, group_scope: &'static str, tag: &'static str, rule_id: impl Into<Arc<str>>, ) -> Self
Assert segment tag is present in every occurrence of group group_scope.
For example, require_segment_in_group("SG5", "LOC", "SG5-LOC-M") fires
once per SG5 instance that contains no LOC segment.
Issues are automatically annotated with the group name.
Sourcepub fn forbid_segment_in_group(
self,
group_scope: &'static str,
tag: &'static str,
rule_id: impl Into<Arc<str>>,
) -> Self
pub fn forbid_segment_in_group( self, group_scope: &'static str, tag: &'static str, rule_id: impl Into<Arc<str>>, ) -> Self
Assert segment tag does not appear in any occurrence of group group_scope.
Emits an Error-severity issue for each occurrence found.
Sourcepub fn require_qualifier_in_group(
self,
group_scope: &'static str,
tag: &'static str,
element: u8,
component: u8,
qualifier: &'static str,
rule_id: impl Into<Arc<str>>,
) -> Self
pub fn require_qualifier_in_group( self, group_scope: &'static str, tag: &'static str, element: u8, component: u8, qualifier: &'static str, rule_id: impl Into<Arc<str>>, ) -> Self
Assert qualifier qualifier at (element, component) in segment tag is
present in every occurrence of group group_scope.
Sourcepub fn group_rule_count(&self) -> usize
pub fn group_rule_count(&self) -> usize
Return the number of group-scoped rules in this pack.
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.
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.
§Errors
Returns EdifactError::IncompatibleReleaseScopes if both packs specify
different release scopes.
§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_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.
§Errors
Returns EdifactError::IncompatibleReleaseScopes if both packs specify
different release scopes.
§Example
let base = ProfileRulePack::new("UTILMD-5.4")
.with_named_stateless_rule_fn("AHB-11001-BGM-M", |segs, _issues| { /* old */ });
let delta = ProfileRulePack::new("UTILMD-5.5-delta")
.with_named_stateless_rule_fn("AHB-11001-BGM-M", |segs, _issues| { /* updated */ });
// `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 Clone for ProfileRulePack
impl Clone for ProfileRulePack
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.Source§fn validate_group_batch(
&self,
root: &SegmentGroupIndexed,
all_segments: &[Segment<'_>],
report: &mut ValidationReport,
context: &ValidationRuleContext<'_>,
)
fn validate_group_batch( &self, root: &SegmentGroupIndexed, all_segments: &[Segment<'_>], report: &mut ValidationReport, context: &ValidationRuleContext<'_>, )
report. Read moreSource§fn fork(&self) -> Box<dyn Validator + Send + Sync>
fn fork(&self) -> Box<dyn Validator + Send + Sync>
Box<dyn Validator> clone of this validator for context forking. 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<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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