Skip to main content

Currency

Struct Currency 

pub struct Currency([u8; 3]);
Expand description

An ISO 4217 currency code (three uppercase ASCII letters).

The code is stored inline as the three bytes it is, not in a heap allocation: Currency::new is the only constructor and it validates the width, so the representation cannot be handed anything else. That makes Currency Copy and makes naming a trade’s currency free — it was one heap allocation per pricing call, and a book valuation makes one per trade.

Tuple Fields§

§0: [u8; 3]

Implementations§

§

impl Currency

pub fn new(code: &str) -> Result<Self, VocabularyParseError>

Constructs a currency from an ISO 4217 code, validating its shape.

§Errors

VocabularyParseError naming the accepted form when code is not exactly three ASCII uppercase letters. The shape is all that is checked: a well-formed code naming no real currency is accepted, because this type is a validated three-byte code and not a registry.

pub fn code(&self) -> &str

The ISO 4217 code.

§The re-validation here is deliberate, and it is not free

The bytes came from new, which admits only ASCII uppercase, so they are valid UTF-8 by construction and from_utf8 can never fail. It runs anyway, because the alternative is from_utf8_unchecked and this crate has exactly one unsafe block (core::ad::active_tape); a second one was weighed against what it buys and declined.

What it costs, measured: lookups/fx_convert_direct is a ~20 ns benchmark that is little more than two code() calls and a hashed map probe, and it runs +16% slower than the String representation this replaced — reproduced isolated, twice. fx_convert_triangulated gives up ~7 points on the same axis. In absolute terms that is roughly 3 ns per conversion, and a book pays it once per foreign-currency trade.

So: if a profile ever shows code() mattering somewhere that is not a micro-benchmark, the fix is known and measured — it is a decision to revisit, not a discovery to make. Do not swap it silently in either direction.

§Panics

Never in practice. The bytes were validated as ASCII uppercase by new, so the UTF-8 check above cannot fail; a panic here would mean a Currency was built bypassing its only constructor.

pub fn minor_units(&self) -> u8

The ISO 4217 minor-unit digit count (e.g. USD = 2, JPY = 0).

Currency carries this metadata but no settlement behaviour; FX spot lag is a per-pair convention modelled in FxIndex. Unknown codes default to 2 (the most common ISO 4217 case).

pub fn settlement_center(&self) -> Option<BusinessCenter>

This currency’s default settlement BusinessCenter, or None if the currency has no modelled center. Supplies the calendar for currencies in the fallback (unlisted-pair) path; listed pairs use their explicit calendar expression in FxIndex.

Trait Implementations§

§

impl Clone for Currency

§

fn clone(&self) -> Currency

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
§

impl Copy for Currency

§

impl Debug for Currency

§

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

Prints as Currency("USD") — what the derived form printed when the code was a String, rather than the byte array the code is stored as.

§

impl Display for Currency

§

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

Formats the value using the given formatter. Read more
§

impl Eq for Currency

§

impl FromStr for Currency

§

type Err = VocabularyParseError

The associated error which can be returned from parsing.
§

fn from_str(s: &str) -> Result<Self, Self::Err>

Parses a string s to return a value of this type. Read more
§

impl Hash for Currency

§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
§

impl Ord for Currency

§

fn cmp(&self, other: &Currency) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 (const: unstable) · Source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 (const: unstable) · Source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 (const: unstable) · Source§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized,

Restrict a value to a certain interval. Read more
§

impl PartialEq for Currency

§

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

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

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

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
§

impl PartialOrd for Currency

§

fn partial_cmp(&self, other: &Currency) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 (const: unstable) · Source§

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

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 (const: unstable) · Source§

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

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 (const: unstable) · Source§

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

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 (const: unstable) · Source§

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

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
§

impl StructuralPartialEq for Currency

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<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> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. 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.