Skip to main content

PricingPolicy

Struct PricingPolicy 

Source
#[non_exhaustive]
pub struct PricingPolicy { pub component_decimals: u32, pub currency_decimals: u32, pub rounding: RoundingStrategy, pub quantity_decimals: u32, pub quantisation: Quantisation, }
Available on crate feature tariffs only.
Expand description

How and when to round money.

Fields (Non-exhaustive)§

This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.
§component_decimals: u32

Decimal places each dimension’s cost is rounded to before the totals are summed.

Default 4, which is the precision the specification names for OCPI numbers: “Unless mentioned otherwise, numbers use 4 decimals.”

§currency_decimals: u32

Decimal places the final total is rounded to.

Default 2: the minor unit of the great majority of currencies. Set to 0 for JPY, 3 for KWD and the other three-decimal currencies.

§rounding: RoundingStrategy

How a value exactly halfway between two representable amounts is resolved.

Default RoundingStrategy::MidpointAwayFromZero — “round half up” — which is what invoicing legislation in most of Europe assumes.

§quantity_decimals: u32

Decimal places the quantities in a CostBreakdown are reported to.

Default 6, which resolves a second of time (1/3600 h ≈ 0.000278) and a tenth of a watt hour, and is comfortably inside what a JSON number carries exactly.

This exists because a measured quantity is not always a short decimal. Summing PARKING_TIME volumes, or converting seconds to hours, produces values like 0.13333333333333333333333333333 — exact as a Decimal, but with more significant digits than a JSON number preserves, so a breakdown carrying one would fail Number::json_round_trips and be reported as Imprecise by the crate’s own validator. An auditable artefact that does not survive being written down is not auditable.

Money is not rounded to this: costs are computed from the exact quantity and then rounded by component_decimals. This setting decides what the breakdown says was measured, never what was charged.

§quantisation: Quantisation

Whether to apply step_size block billing.

Default Quantisation::StepSize. OCPI 3.0 removes step_size in favour of full-precision metering, so this is a pluggable stage rather than a hard-wired one:

NOTE: The step_size field is no longer present in OCPI 3.0. In OCPI 3.0, Parties are advised to measure quantities as precise as required by calibration law and use the full precision of such measurements in cost computation.

Implementations§

Source§

impl PricingPolicy

Source

pub fn zero_decimal_currency() -> Self

A policy for a currency with no minor unit, such as JPY.

Source

pub fn without_step_size(self) -> Self

A policy that ignores step_size, as OCPI 3.0 will.

Source

pub fn round_component(&self, value: Number) -> Number

Rounds an intermediate per-dimension cost.

Source

pub fn round_currency(&self, value: Number) -> Number

Rounds a final, presentable amount.

Source

pub fn round_quantity(&self, value: Number) -> Number

Rounds a quantity for reporting. See quantity_decimals.

Trait Implementations§

Source§

impl Clone for PricingPolicy

Source§

fn clone(&self) -> PricingPolicy

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 PricingPolicy

Source§

impl Debug for PricingPolicy

Source§

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

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

impl Default for PricingPolicy

Source§

fn default() -> Self

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

impl Eq for PricingPolicy

Source§

impl PartialEq for PricingPolicy

Source§

fn eq(&self, other: &PricingPolicy) -> 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 PricingPolicy

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

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
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 = !

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.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more