pub enum QuotaOutcome {
NotQuotaed,
Allowed {
limit: u64,
remaining: u64,
reset_epoch_s: u64,
},
Denied {
limit: u64,
remaining: u64,
reset_epoch_s: u64,
retry_after_s: u32,
budget: Budget,
},
Unavailable,
}Expand description
What the quota check decided for one request (DW-033). Shape mirrors the rate limiter’s outcome type (extensions::rate_limiter, named textually — a doc link would be an upward import) so the request path answers both with the same 429 builder.
Variants§
NotQuotaed
No budget applied (no quota config, anonymous traffic, or no state store attached): the request is not quota-gated and carries no quota headers.
Allowed
Admitted (the unit is already spent — check reserves like the
rate limiter does). limit/remaining/reset_epoch_s describe
the binding constraint (the budget with the least remaining).
Quotas stamp headers on DENIALS only: an admitted response’s
X-RateLimit-* family belongs to the rate limiter when it
applies (documented choice — two mechanisms would race to write
the same header names on every success).
Denied
Over budget: answer 429 with Retry-After = retry_after_s
(ceil to the window boundary, min 1) and the binding budget’s
Limit/Remaining/Reset headers. budget names which wall was hit
(the metric label); when both budgets deny, the headers come
from the first (daily) and retry_after_s is the MAXIMUM wait.
The store failed mid-check: the gateway cannot vouch for the budget either way. The request path answers 500 (the authN “unavailable” posture), never a guess.
Trait Implementations§
Source§impl Clone for QuotaOutcome
impl Clone for QuotaOutcome
Source§fn clone(&self) -> QuotaOutcome
fn clone(&self) -> QuotaOutcome
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for QuotaOutcome
impl Debug for QuotaOutcome
Source§impl PartialEq for QuotaOutcome
impl PartialEq for QuotaOutcome
impl Copy for QuotaOutcome
impl Eq for QuotaOutcome
impl StructuralPartialEq for QuotaOutcome
Auto Trait Implementations§
impl Freeze for QuotaOutcome
impl RefUnwindSafe for QuotaOutcome
impl Send for QuotaOutcome
impl Sync for QuotaOutcome
impl Unpin for QuotaOutcome
impl UnwindSafe for QuotaOutcome
Blanket Implementations§
§impl<T> AnyExt for T
impl<T> AnyExt for T
§fn downcast_ref<T>(this: &Self) -> Option<&T>where
T: Any,
fn downcast_ref<T>(this: &Self) -> Option<&T>where
T: Any,
T behind reference§fn downcast_mut<T>(this: &mut Self) -> Option<&mut T>where
T: Any,
fn downcast_mut<T>(this: &mut Self) -> Option<&mut T>where
T: Any,
T behind mutable reference§fn downcast_rc<T>(this: Rc<Self>) -> Result<Rc<T>, Rc<Self>>where
T: Any,
fn downcast_rc<T>(this: Rc<Self>) -> Result<Rc<T>, Rc<Self>>where
T: Any,
T behind Rc pointer§fn downcast_arc<T>(this: Arc<Self>) -> Result<Arc<T>, Arc<Self>>where
T: Any,
fn downcast_arc<T>(this: Arc<Self>) -> Result<Arc<T>, Arc<Self>>where
T: Any,
T behind Arc pointer§fn downcast_box<T>(this: Box<Self>) -> Result<Box<T>, Box<Self>>where
T: Any,
fn downcast_box<T>(this: Box<Self>) -> Result<Box<T>, Box<Self>>where
T: Any,
T behind Box pointer§fn downcast_move<T>(this: Self) -> Option<T>
fn downcast_move<T>(this: Self) -> Option<T>
Self to T,
useful only in generic context as a workaround for specializationSource§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T, X> CoerceTo<T> for Xwhere
T: CoerceFrom<X> + ?Sized,
impl<T, X> CoerceTo<T> for Xwhere
T: CoerceFrom<X> + ?Sized,
fn coerce_rc_to(self: Rc<X>) -> Rc<T>
fn coerce_box_to(self: Box<X>) -> Box<T>
fn coerce_ref_to(&self) -> &T
fn coerce_mut_to(&mut self) -> &mut T
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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