pub struct ServiceStringAdvice {
pub element_sep: u8,
pub component_sep: u8,
pub release_char: u8,
pub decimal_mark: u8,
pub repetition_sep: u8,
pub segment_term: u8,
}Expand description
EDIFACT service string advice — the six characters of the UNA
(ISO 9735-1 Annex B).
The five active service characters — component separator, element
separator, release character, repetition separator, and segment terminator —
are what is_valid enforces: printable non-alphanumeric
ASCII, mutually distinct, so a collision between the repetition separator and
any other delimiter, or a delimiter that would clash with segment-tag
characters, is caught at UNA parse time.
The decimal mark is deliberately not in that set; see
decimal_mark.
§Defaults
ISO 9735-1 §5.1 fixes the defaults as : (component), + (element), ?
(release), * (repetition), ' (terminator). Syntax version 4 is the
version that defines the repetition separator at all: in versions 1–3 that
UNA position is reserved and carries a space. Default is therefore the
version-agnostic reading — everything per §5.1 except repetition, which
stays inactive until something says the interchange is version 4. See
for_syntax_version.
Fields§
§element_sep: u8Data element separator (default +; UNA position 020)
component_sep: u8Component data element separator (default :; UNA position 010)
release_char: u8Release character (default ?; UNA position 040)
decimal_mark: u8Decimal mark (UNA position 030), default ..
Ignored on receipt. ISO 9735-1 Annex B keeps this position only for
upward compatibility with earlier syntax versions and states that the
character transferred here “shall be ignored by the recipient”; §10
instead allows the full stop or the comma per individual numeric value.
It is therefore neither validated nor used for splitting — it is
preserved so a writer can round-trip the UNA it was given, and so
DecimalFloat has a house style to format
with.
repetition_sep: u8Repetition separator (UNA position 050), introduced by syntax version 4.
A space (0x20) means not used: that is what versions 1–3 put in this
reserved position, and version 4 forbids a space here precisely because
the position now carries a real separator.
When the separator is active the tokenizer splits on it: a data element
carrying ON:1*ON:2 becomes one element with two repetitions rather than
one repetition whose second component is the literal text 1*ON. Use
is_repetition_active to test for this.
segment_term: u8Segment terminator (default '; UNA position 060)
Implementations§
Source§impl ServiceStringAdvice
impl ServiceStringAdvice
Sourcepub fn from_bytes(input: &[u8]) -> Result<Self, EdifactError>
pub fn from_bytes(input: &[u8]) -> Result<Self, EdifactError>
Read the service characters an interchange actually uses.
Two sources, in priority order:
- A leading
UNA, which states all six characters explicitly. - Otherwise the ISO 9735-1 §5.1 defaults, with the repetition separator
resolved from the syntax version in
UNBS001 DE 0002 — seefor_syntax_version.
§Errors
EdifactError::InvalidUna when a UNA is present but its active
service characters are not mutually distinct printable non-alphanumeric
ASCII. See is_valid for the exact rule.
This is the safe, default constructor — always use this for input from
an external source. For trusted or internal use where delimiter uniqueness
is already guaranteed, use from_bytes_unchecked.
Sourcepub fn from_bytes_unchecked(input: &[u8]) -> Self
pub fn from_bytes_unchecked(input: &[u8]) -> Self
Parse a UNA header from the beginning of an EDIFACT interchange without validating delimiter uniqueness or printability.
When no UNA is present the §5.1 defaults apply, with the repetition
separator taken from the syntax version declared in UNB S001 DE 0002.
§When to use
Use this only for trusted internal data (e.g. round-tripping data where the UNA invariant is already guaranteed) or in fuzz/property tests that intentionally explore degenerate delimiter combinations.
For any external or user-provided input, prefer from_bytes
which validates delimiter uniqueness and rejects invalid bytes.
Sourcepub const fn for_syntax_version(version: Option<u8>) -> Self
pub const fn for_syntax_version(version: Option<u8>) -> Self
The ISO 9735-1 §5.1 defaults for a given syntax version.
The repetition separator is the only character the version decides:
version 4 introduced it as *, and versions 1–3 have no such service
character at all — that UNA position is reserved and carries a space.
Splitting on * in a version 3 interchange would corrupt every value
containing one, since * is an ordinary level A character there.
None means the version could not be determined (no UNB, or an
unreadable one) and is treated as “not version 4”.
§Example
use edifact_rs::ServiceStringAdvice;
assert!(ServiceStringAdvice::for_syntax_version(Some(4)).is_repetition_active());
assert!(!ServiceStringAdvice::for_syntax_version(Some(3)).is_repetition_active());
assert!(!ServiceStringAdvice::for_syntax_version(None).is_repetition_active());Sourcepub fn is_valid(&self) -> bool
pub fn is_valid(&self) -> bool
Return true if all active service characters are mutually distinct
and printable, non-alphanumeric ASCII.
The active set is the component separator, element separator, release
character, segment terminator, and — when it is not the space “not used”
sentinel — the repetition separator. Each must be in 0x21..=0x7E
excluding 0-9A-Za-z, and all must differ pairwise.
Alphanumerics are excluded because segment tags are always three ASCII
uppercase letters written verbatim (a tag cannot be escaped). A delimiter
such as N would make NAD unrepresentable — the writer would emit a
premature terminator and the result would not reparse. High bytes
(>= 0x80) are rejected because they would bisect multi-byte UTF-8
sequences, and DEL (0x7F) is a control character.
The decimal mark is not checked at all: ISO 9735-1 Annex B states that
the character in that position “shall be ignored by the recipient”, and is
the one position where the standard permits a space. Rejecting a UNA
over a character the standard tells receivers to ignore would fail
conformant interchanges for nothing.
§Example
use edifact_rs::ServiceStringAdvice;
// A duplicated *active* character is fatal …
assert!(ServiceStringAdvice::from_bytes(b"UNA::.? '").is_err());
// … but the ignored decimal-mark slot may hold anything, even a space.
assert!(ServiceStringAdvice::from_bytes(b"UNA:+ ? '")?.is_repetition_active() == false);Sourcepub const fn is_repetition_active(&self) -> bool
pub const fn is_repetition_active(&self) -> bool
Returns true when this interchange declares a usable repetition
separator (UNA position 050, syntax version 4).
A space there means “not used” — the reserved value carried by syntax
versions 1–3 — so it reports false and the tokenizer never splits on it.
§Example
use edifact_rs::ServiceStringAdvice;
assert!(!ServiceStringAdvice::default().is_repetition_active());
assert!(ServiceStringAdvice::from_bytes(b"UNA:+.?*'")?.is_repetition_active());Trait Implementations§
Source§impl Clone for ServiceStringAdvice
impl Clone for ServiceStringAdvice
Source§fn clone(&self) -> ServiceStringAdvice
fn clone(&self) -> ServiceStringAdvice
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl Copy for ServiceStringAdvice
Source§impl Debug for ServiceStringAdvice
impl Debug for ServiceStringAdvice
Source§impl Default for ServiceStringAdvice
impl Default for ServiceStringAdvice
impl Eq for ServiceStringAdvice
Source§impl PartialEq for ServiceStringAdvice
impl PartialEq for ServiceStringAdvice
impl StructuralPartialEq for ServiceStringAdvice
Auto Trait Implementations§
impl Freeze for ServiceStringAdvice
impl RefUnwindSafe for ServiceStringAdvice
impl Send for ServiceStringAdvice
impl Sync for ServiceStringAdvice
impl Unpin for ServiceStringAdvice
impl UnsafeUnpin for ServiceStringAdvice
impl UnwindSafe for ServiceStringAdvice
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