Skip to main content

Next

Struct Next 

Source
pub struct Next<App = ()> { /* private fields */ }
Expand description

A linear, single-use execution cursor over middleware.

Middleware receives ownership of next and may either delegate to the subsequent middleware in the deque or build a response and terminate execution altogether.

Next has strict ownership semantics with a consuming API. When the “next” middleware is called, ownership of self and request are transferred to the middleware popped from the front of the deque. If the deque is empty, Next returns a 404 Not Found error.

Because Next owns the remaining middleware chain, choosing not to call it is how middleware terminates or rejects a request. This makes control flow explicit: downstream middleware only execute when an upstream middleware delegates to them.

Next cannot be cloned or reused. This prevents middleware from executing the same downstream chain more than once, speculatively observing rejected requests, or continuing execution after a terminal middleware has already produced a response.

Implementations§

Source§

impl<App> Next<App>

Source

pub fn call(self, request: Request<App>) -> BoxFuture

Call the “next” middleware in the logical call stack for the request.

§Example
use via::{Middleware, middleware};

/// Forwards `request` to the "next" middleware.
fn forward<App>() -> impl Middleware<App> + 'static {
    middleware(|request, next| next.call(request))
}

Trait Implementations§

Source§

impl<App> Drop for Next<App>

Explicitly implement Drop to make a supply-chain risk a build-time error.

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more

Auto Trait Implementations§

§

impl<App = ()> !RefUnwindSafe for Next<App>

§

impl<App = ()> !UnwindSafe for Next<App>

§

impl<App> Freeze for Next<App>

§

impl<App> Send for Next<App>

§

impl<App> Sync for Next<App>

§

impl<App> Unpin for Next<App>

§

impl<App> UnsafeUnpin for Next<App>

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

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

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.