Skip to main content

ServiceStringAdvice

Struct ServiceStringAdvice 

Source
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: u8

Data element separator (default +; UNA position 020)

§component_sep: u8

Component data element separator (default :; UNA position 010)

§release_char: u8

Release character (default ?; UNA position 040)

§decimal_mark: u8

Decimal 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: u8

Repetition 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: u8

Segment terminator (default '; UNA position 060)

Implementations§

Source§

impl ServiceStringAdvice

Source

pub fn from_bytes(input: &[u8]) -> Result<Self, EdifactError>

Read the service characters an interchange actually uses.

Two sources, in priority order:

  1. A leading UNA, which states all six characters explicitly.
  2. Otherwise the ISO 9735-1 §5.1 defaults, with the repetition separator resolved from the syntax version in UNB S001 DE 0002 — see for_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.

Source

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.

Source

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

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

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

Source§

fn clone(&self) -> ServiceStringAdvice

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for ServiceStringAdvice

Source§

impl Debug for ServiceStringAdvice

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ServiceStringAdvice

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl Eq for ServiceStringAdvice

Source§

impl PartialEq for ServiceStringAdvice

Source§

fn eq(&self, other: &ServiceStringAdvice) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for ServiceStringAdvice

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. 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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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.