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]
Slices 2 and 3 add fields here — rate-limit tunables and whatever
policy evaluation needs — and this crate is unreleased, so the marker
costs nothing now and saves a second breaking release later. Consumers
build one with OpAdmission::new, OpAdmission::unresolved or the
two From impls below rather than a struct literal; reading the public
fields is unaffected. Same reasoning ConflictTarget
(cratestack-sql) and CratestackError already 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. Carried but
unread in slice 1 (rate limiting is still an L4 tower::Layer);
it is here so a later slice does not have to change this type.
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 every in-tree caller; this exists
for a consumer whose descriptors do not come from a generated
OPS/ROUTE_TRANSPORTS slice, and as the supported alternative to
the struct literal #[non_exhaustive] now 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, which is the opposite direction
from cratestack-axum’s rate-limit filters, 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
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
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<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> 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<'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].