Struct OpAdmission
#[non_exhaustive]pub struct OpAdmission {
pub diagnostic_op_id: &'static str,
pub idempotent_by_default: bool,
pub rate_limited_by_default: bool,
}Expand description
The participation facts a schema declares about one op, lifted off whichever descriptor the schema’s transport emitted.
REST schemas emit RouteTransportDescriptor and RPC schemas emit
OpDescriptor; never both. Both From impls exist so admission
logic is written once against this type rather than twice against two
descriptor shapes — the transport-parity rule in CLAUDE.md, and the
concrete lesson of cratestack#474, where a fix landed on one transport
and silently no-oped on the other.
§#[non_exhaustive]
Later slices may add fields without a breaking release (slice 2 needed
none: rate-limit tunables are limiter configuration, not a per-op fact).
Build one with OpAdmission::new, OpAdmission::unresolved or the
From impls below; reading the public fields is unaffected. Same
reasoning ConflictTarget (cratestack-sql) and CratestackError use.
Fields (Non-exhaustive)§
This struct is marked as non-exhaustive
Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.diagnostic_op_id: &'static strIdentifier for diagnostics only — nothing here dispatches on it.
The name carries the constraint so a call site cannot forget it
(this is pub in a published crate, where a bare op_id would
read as a dispatch key).
RPC descriptors carry a real dotted op id (procedure.transfer).
REST descriptors carry no such thing, so the From impl below uses
RouteTransportDescriptor::name, which is not unique across a
model’s five verbs. That is acceptable precisely because no
decision reads this field; if one ever does, REST needs a genuine
op id first.
idempotent_by_default: booltrue when the op does not participate in idempotency
reservation — see the field of the same name on OpDescriptor
for the full statement of what the flag means.
rate_limited_by_default: booltrue when the op participates in rate limiting — false is what
@no_rate_limit compiles to. Read by
OpExecutor::rate_limit_applies
since slice 2 (cratestack#877).
Implementations§
§impl OpAdmission
impl OpAdmission
pub const fn new(
diagnostic_op_id: &'static str,
idempotent_by_default: bool,
rate_limited_by_default: bool,
) -> OpAdmission
pub const fn new( diagnostic_op_id: &'static str, idempotent_by_default: bool, rate_limited_by_default: bool, ) -> OpAdmission
Build the admission facts for an op a caller has identified.
The two From impls below cover callers holding a generated
descriptor; this exists for a consumer whose descriptors do not come
from a generated OPS/ROUTE_TRANSPORTS slice (for example
cratestack-axum’s with_should_rate_limit_fn adapter), and as the
supported alternative to the struct literal #[non_exhaustive]
blocks.
pub const fn unresolved() -> OpAdmission
pub const fn unresolved() -> OpAdmission
The facts to assume when a caller could not identify the op at all — no descriptor matched the request, or the caller has no descriptor table wired up.
Fails closed toward reserving, while the same value makes rate
limiting charge the call ([crate::OpExecutor::rate_limit_applies]),
and deliberately so:
for rate limiting the conservative answer is “throttle it”, while
for idempotency the conservative answer is “take the reservation”,
because skipping a reservation is what would let a duplicate
execute twice. Both mean “when in doubt, apply the protection”.
Trait Implementations§
§impl Clone for OpAdmission
impl Clone for OpAdmission
§fn clone(&self) -> OpAdmission
fn clone(&self) -> OpAdmission
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl Copy for OpAdmission
§impl Debug for OpAdmission
impl Debug for OpAdmission
impl Eq for OpAdmission
§impl From<&'static OpDescriptor> for OpAdmission
impl From<&'static OpDescriptor> for OpAdmission
§fn from(descriptor: &'static OpDescriptor) -> OpAdmission
fn from(descriptor: &'static OpDescriptor) -> OpAdmission
§impl From<&'static RouteTransportDescriptor> for OpAdmission
impl From<&'static RouteTransportDescriptor> for OpAdmission
§fn from(descriptor: &'static RouteTransportDescriptor) -> OpAdmission
fn from(descriptor: &'static RouteTransportDescriptor) -> OpAdmission
§impl PartialEq for OpAdmission
impl PartialEq for OpAdmission
impl StructuralPartialEq for OpAdmission
Auto Trait Implementations§
impl Freeze for OpAdmission
impl RefUnwindSafe for OpAdmission
impl Send for OpAdmission
impl Sync for OpAdmission
impl Unpin for OpAdmission
impl UnsafeUnpin for OpAdmission
impl UnwindSafe for OpAdmission
Blanket Implementations§
Source§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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§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<A, B, T> HttpServerConnExec<A, B> for Twhere
B: Body,
§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§impl<'src, T> IntoMaybe<'src, T> for Twhere
T: 'src,
impl<'src, T> IntoMaybe<'src, T> for Twhere
T: 'src,
impl<T> MaybeSend for T
impl<T> MaybeSendSync for T
impl<T> OrderedSeq<'_, T> for Twhere
T: Clone,
§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling [Attribute] value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi [Quirk] value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the [Condition] value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
§impl<'p, T> Seq<'p, T> for Twhere
T: Clone,
impl<'p, T> Seq<'p, T> for Twhere
T: Clone,
§type Iter<'a> = Once<&'a T>
where
T: 'a
type Iter<'a> = Once<&'a T> where T: 'a
§fn contains(&self, val: &T) -> boolwhere
T: PartialEq,
fn contains(&self, val: &T) -> boolwhere
T: PartialEq,
§fn to_maybe_ref<'b>(item: <T as Seq<'p, T>>::Item<'b>) -> Maybe<T, &'p T>where
'p: 'b,
fn to_maybe_ref<'b>(item: <T as Seq<'p, T>>::Item<'b>) -> Maybe<T, &'p T>where
'p: 'b,
MaybeRef].