Skip to main content

Grant

Enum Grant 

Source
#[non_exhaustive]
pub enum Grant { Now, Later(Instant), Never, LargerThanBurst { burst_bytes: u64, unit_bytes: u64, }, }
Expand description

What charge decided about one unit.

#[non_exhaustive] with no Default: there is no safe default answer. Defaulting to Now would silently unshape a bucket; defaulting to Never would silently stall one.

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

Now

The unit may go now. The tokens have already been debited.

§

Later(Instant)

Not now. The bucket holds enough at this instant and not before, so this is the deadline to arm.

The instant is earliest, not exact: another stream sharing the bucket may drain it again before this one wakes, in which case the next charge answers Later again with a new deadline.

§

Never

Not now, and no refill instant exists, because the rate is Some(0) and the bucket therefore never refills.

The caller must supply its own deadline, which is the unit’s max_hold clamp. Returning a fabricated far-future instant instead was rejected: it would arm a release timer that never fires, and nothing downstream could tell that deadline from a real one.

§

LargerThanBurst

Not now, and not ever from tokens: the unit is larger than the whole bucket, so no amount of refilling reaches it.

A separate answer from Self::Never, and the separation is the point. Both leave the caller to fall back on the max_hold clamp, so the two are identical in what they do; they are opposite in what they mean. Never is a rate of zero doing exactly what it was asked to. This is a rate that was asked for and cannot be delivered, because the bucket cannot hold one object’s worth of tokens — every unit leaves at the clamp and the configured rate never binds at all. Folded into one variant, the second is invisible: it produces the same clamp, the same tokens_exhausted_episodes and the same HoldClamped report a working rate limit produces.

Reachable only with a non-zero rate — a zero rate is answered first — so a caller reporting this is always reporting a burst that is too small and never a class that was configured to stop.

Fields

§burst_bytes: u64

The bucket’s cap, which is BucketConfig::burst_bytes.

§unit_bytes: u64

The unit that did not fit, so the report can quote both numbers rather than leaving the reader to find one of them.

Trait Implementations§

Source§

impl Clone for Grant

Source§

fn clone(&self) -> Grant

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 Grant

Source§

impl Debug for Grant

Source§

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

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

impl Eq for Grant

Source§

impl PartialEq for Grant

Source§

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

Auto Trait Implementations§

§

impl Freeze for Grant

§

impl RefUnwindSafe for Grant

§

impl Send for Grant

§

impl Sync for Grant

§

impl Unpin for Grant

§

impl UnsafeUnpin for Grant

§

impl UnwindSafe for Grant

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> 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> 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