Skip to main content

Total

Enum Total 

Source
pub enum Total {
    Exact(EstimatedUsd),
    AtLeast {
        floor: EstimatedUsd,
        unpriced: Vec<UnpricedLine>,
    },
}
Expand description

A report’s total, which is a lower bound whenever anything is unpriced (COST-4).

Two variants rather than a struct with a flag, and that is the upgrade over the Python’s Total(priced, unpriced=()): there a consumer could read .priced and never look at .is_lower_bound, so the honesty rule depended on the caller checking. Here the floor is inside Total::AtLeast, beside the reasons, so reaching it means seeing them. A plain sum cannot express “everything we could price, plus a build AWS will not tell us the price of”, and the natural way to force it to — dropping the unpriced line — is exactly the lie this module exists not to tell.

Variants§

§

Exact(EstimatedUsd)

Every line item was priced, so this is the whole estimate.

§

AtLeast

At least this much, plus line items with no published rate.

Fields

§floor: EstimatedUsd

The sum of the priced lines. Not the total — the total is unknowable.

§unpriced: Vec<UnpricedLine>

The lines that could not be priced, in report order.

Non-empty by construction: Total::of answers Total::Exact when there is nothing to name, so an AtLeast with an empty list — a lower bound that will not say what it is missing — is not a value this type holds.

Implementations§

Source§

impl Total

Source

pub fn of<'a>( amounts: impl IntoIterator<Item = (CostPhase, &'a Amount)>, ) -> Total

The total over a report’s amounts, each labelled with the phase it came from.

The one place a total is computed, so COST-4 holds for every consumer rather than for the ones that remembered. An unpriced amount routes the whole answer to Total::AtLeast; it is never skipped and never summed as zero.

Takes (phase, amount) rather than a bare amount so the phase cannot go missing on the way in: the rendered total names phases, and a Total built without them could only fall back to printing reasons.

Source

pub fn floor(&self) -> EstimatedUsd

Everything that could be priced.

Named floor rather than total on purpose: for Total::AtLeast it is a lower bound, and a consumer reading a field called total would have no reason to check which variant it came from.

Source

pub fn is_lower_bound(&self) -> bool

True when line items with no published rate are missing from the floor.

Source

pub fn unpriced_lines(&self) -> &[UnpricedLine]

The lines that could not be priced. Empty for Total::Exact.

Source

pub fn unpriced_reasons(&self) -> Vec<String>

The reasons the unpriced lines could not be priced, in report order. Empty for Total::Exact.

Kept beside Total::unpriced_lines because the reason is what a consumer surfacing the why wants, while the rendered total names phases.

Source

pub fn unpriced_phase_names(&self) -> Vec<&'static str>

The distinct phase names of the unpriced lines, sorted — what the rendered total names.

Sorted and deduplicated to match cost.py:342’s ", ".join(sorted({item.phase.value for item in self.unpriced})): two unpriced lines in one phase name it once, and the order does not depend on report order.

Trait Implementations§

Source§

impl Clone for Total

Source§

fn clone(&self) -> Total

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 Debug for Total

Source§

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

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

impl Display for Total

“at least” is the whole point, so it leads.

The parenthetical names phases, not reasons, which is cost.py:343 verbatim. A reason is a sentence explaining what AWS does not publish, and joining several of them turns a one-line total into a paragraph the two clients cannot both print.

Source§

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

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

impl Eq for Total

Source§

impl PartialEq for Total

Source§

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

Auto Trait Implementations§

§

impl Freeze for Total

§

impl RefUnwindSafe for Total

§

impl Send for Total

§

impl Sync for Total

§

impl Unpin for Total

§

impl UnsafeUnpin for Total

§

impl UnwindSafe for Total

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> 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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<Unshared, Shared> IntoShared<Shared> for Unshared
where Shared: FromUnshared<Unshared>,

Source§

fn into_shared(self) -> Shared

Creates a shared type from an unshared type.
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> Same for T

Source§

type Output = T

Should always be Self
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 = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

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