Skip to main content

AsyncAppWithState

Struct AsyncAppWithState 

Source
pub struct AsyncAppWithState<S> { /* private fields */ }
Available on crate feature http2 only.
Expand description

An Application whose route handlers are async functions.

State is stored as Arc<S> and passed by value (cheap clone) to each handler invocation. Handlers receive owned Request, PathParams, and ConnectionInfo values so the returned future is 'static.

Implementations§

Source§

impl<S> AsyncAppWithState<S>
where S: Send + Sync + 'static,

Source

pub fn new(state: S) -> AsyncAppWithState<S>

Create a new AsyncAppWithState wrapping state.

Source

pub fn with_config(self, config: ServerConfig) -> AsyncAppWithState<S>

Pin the fallback App (used for any request this app’s own routes don’t match) to an explicit crate::server_config::ServerConfig, instead of reading RWS_CONFIG_* environment variables per request.

Mirrors App::with_config / crate::state::AppWithState::with_config.

Source

pub fn state(&self) -> &S

Return a reference to the shared state.

Source

pub fn route_entries(&self) -> Vec<RouteInfo>

Return a snapshot of all registered routes as (method, pattern) pairs.

Source

pub fn route_conflicts(&self) -> Vec<RouteConflict>

Routes that never run because an earlier one with the same method matches every path they do (18.28.0). See Router::route_conflicts; each is also printed once to stderr when it’s registered.

Source

pub fn route<H>(self, handler: H) -> AsyncAppWithState<S>
where H: AsyncHandler<S>,

Register a typed handler (18.28.0): an async fn (or a sync function) with extractor arguments annotated #[get("/path")] & co.; the method and pattern come from the attribute.

ⓘ
#[get("/posts/{id}")]
async fn show_post(Path(id): Path<i64>, State(pool): State<DbPool>) -> Result<Json<Post>, AppError> {
    // … .await …
}

let app = App::with_async_state(pool).route(show_post);
Source

pub fn get<F, Fut>(self, pattern: &str, handler: F) -> AsyncAppWithState<S>
where F: Fn(Request, PathParams, ConnectionInfo, Arc<S>) -> Fut + Send + Sync + 'static, Fut: Future<Output = Response> + Send + 'static,

Register an async GET handler for pattern.

Source

pub fn post<F, Fut>(self, pattern: &str, handler: F) -> AsyncAppWithState<S>
where F: Fn(Request, PathParams, ConnectionInfo, Arc<S>) -> Fut + Send + Sync + 'static, Fut: Future<Output = Response> + Send + 'static,

Register an async POST handler for pattern.

Source

pub fn put<F, Fut>(self, pattern: &str, handler: F) -> AsyncAppWithState<S>
where F: Fn(Request, PathParams, ConnectionInfo, Arc<S>) -> Fut + Send + Sync + 'static, Fut: Future<Output = Response> + Send + 'static,

Register an async PUT handler for pattern.

Source

pub fn patch<F, Fut>(self, pattern: &str, handler: F) -> AsyncAppWithState<S>
where F: Fn(Request, PathParams, ConnectionInfo, Arc<S>) -> Fut + Send + Sync + 'static, Fut: Future<Output = Response> + Send + 'static,

Register an async PATCH handler for pattern.

Source

pub fn delete<F, Fut>(self, pattern: &str, handler: F) -> AsyncAppWithState<S>
where F: Fn(Request, PathParams, ConnectionInfo, Arc<S>) -> Fut + Send + Sync + 'static, Fut: Future<Output = Response> + Send + 'static,

Register an async DELETE handler for pattern.

Source

pub fn openapi(self, config: OpenApiConfig) -> AsyncAppWithState<S>

Available on crate feature openapi only.

Add GET /openapi.json (a generated OpenAPI 3.1 document covering every route registered so far) and GET /docs (Swagger UI, loaded from a CDN, pointed at /openapi.json).

Call this after registering your routes — routes added afterward still work but won’t appear in the generated spec, since it’s built once at this call rather than read dynamically per request.

Requires the openapi feature (and http2, since AsyncAppWithState already requires it).

Trait Implementations§

Source§

impl<S> Application for AsyncAppWithState<S>
where S: Send + Sync + 'static,

Source§

fn execute( &self, request: &Request, connection: &ConnectionInfo, ) -> Result<Response, String>

Receives a parsed request and returns a fully-built response. Walk your controller list with is_matching / process and return the first match.
Source§

fn registered_routes(&self) -> Vec<RouteInfo>

The routes this application registers, as (method, pattern) — what AppWithState::route_entries returns; wrappers (WithMiddleware, McpServer) report the routes of the application inside. For tools that describe an app (the dev MCP server’s routes tool), not for dispatch. Default: none. Since 18.28.0.
Source§

fn runs_inline(&self, _request: &Request, _connection: &ConnectionInfo) -> bool

true when executing request is quick and never waits on anything but the local filesystem — health checks, metrics, small static files. The async servers (HTTP/1.1, HTTP/2, HTTP/3) then call execute directly on the event loop, as nginx does, instead of handing the request to tokio’s blocking pool: that handoff (a shared lock and two cross-thread wake-ups) costs more than serving a small file. Read more
Source§

fn execute_async<'a>( &'a self, _request: &'a Request, _connection: &'a ConnectionInfo, ) -> Option<Pin<Box<dyn Future<Output = Result<Response, String>> + Send + 'a>>>

Available on crate feature http2 only.
An asynchronous version of execute for this request, when the application has one: the async servers await it on the connection’s task instead of tying up a blocking-pool thread while it waits (the config-driven proxy uses this to wait for a backend without holding a thread). None (the default) means “use execute”. Wrappers return Some only when they add no synchronous work of their own.
Source§

fn streams_body(&self, _request: &Request, _connection: &ConnectionInfo) -> bool

true to receive this request’s body as a stream (Body::Stream) instead of read into memory first: execute then runs while the body is still arriving, on a blocking-pool thread, and reads it with std::io::Read — a multi-gigabyte upload in a few chunks of memory. Asked after the head is read, so request.body is empty here; decide from the method, path and headers. Read more
Source§

fn middleware_names(&self) -> Vec<&'static str>

The names of the middleware layers around this application’s routes, in the order a request passes them (Middleware::layer_name). Default: none; WithMiddleware lists its layers, then the inner application’s. Since 18.28.0.
Source§

impl<S> Clone for AsyncAppWithState<S>
where S: Clone,

Source§

fn clone(&self) -> AsyncAppWithState<S>

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

Auto Trait Implementations§

§

impl<S> !RefUnwindSafe for AsyncAppWithState<S>

§

impl<S> !UnwindSafe for AsyncAppWithState<S>

§

impl<S> Freeze for AsyncAppWithState<S>
where Arc<S>: Freeze, Vec<AsyncRoute<S>>: Freeze,

§

impl<S> Send for AsyncAppWithState<S>
where Arc<S>: Send, Vec<AsyncRoute<S>>: Send,

§

impl<S> Sync for AsyncAppWithState<S>
where Arc<S>: Sync, Vec<AsyncRoute<S>>: Sync,

§

impl<S> Unpin for AsyncAppWithState<S>
where Arc<S>: Unpin, Vec<AsyncRoute<S>>: Unpin,

§

impl<S> UnsafeUnpin for AsyncAppWithState<S>
where Arc<S>: UnsafeUnpin, Vec<AsyncRoute<S>>: UnsafeUnpin,

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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

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<A> DevMcpExt for A
where A: Application + Send + Sync + 'static,

Source§

fn dev_mcp(self) -> DevMcp<Self>

The dev MCP endpoint with the default DevTools, in front of this app — or this app alone outside development without a token.
Source§

fn dev_mcp_with(self, tools: DevTools) -> DevMcp<Self>

The same with the tools and gating tools describes.
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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ServiceExt for T

Source§

fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>
where Self: Sized,

Available on crate feature map-response-body only.
Apply a transformation to the response body. Read more
Source§

fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>
where Self: Sized,

Available on crate feature trace only.
High level tracing that classifies responses using HTTP status codes. Read more
Source§

fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>
where Self: Sized,

Available on crate feature trace only.
High level tracing that classifies responses using gRPC headers. Read more
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, !>

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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

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