Trait Resource

Source
pub trait Resource: Clone {
    type Destination: Clone + Send + Sync + 'static;
    type RequestBody: BufStream;
    type Buf: Buf;
    type Body: BufStream<Item = Self::Buf, Error = Error>;
    type Future: ResourceFuture<Body = Self::Body>;

    // Required method
    fn dispatch(
        &mut self,
        destination: Self::Destination,
        route_match: &RouteMatch<'_>,
        body: Self::RequestBody,
    ) -> Self::Future;
}
Expand description

A Resource processes HTTP requests received by the service.

A single service is composed of one or more resources. A resource instance is created with a route set representing the set of routes that it is able to handle. The service merges the route sets together and uses it to match inbound requests.

When matching a route, the route set returns a Self::Destination value. This value is then provided to Resource::dispatch and this is how the resource instance knows which method to dispatch the request to.

Users are not expected to implement Resource themselves. Instead, the impl_web! macro will generate a Resource implementation. The implementation is then passed to ServiceBuilder to define the web service.

Required Associated Types§

Source

type Destination: Clone + Send + Sync + 'static

Token mapping a route to a resource method.

Source

type RequestBody: BufStream

The HTTP request body type.

Source

type Buf: Buf

Buffer type yielded by the response body.

Source

type Body: BufStream<Item = Self::Buf, Error = Error>

The HTTP response body type.

This value will yield one or more Self::Buf values.

Source

type Future: ResourceFuture<Body = Self::Body>

Response future

Required Methods§

Source

fn dispatch( &mut self, destination: Self::Destination, route_match: &RouteMatch<'_>, body: Self::RequestBody, ) -> Self::Future

Process the HTTP request and return the response asynchronously.

The HTTP request has already been matched against the route set before calling this function. The destination and route_match arguments provide the necessary context for the resource to process the matched HTTP request.

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl<R0> Resource for (R0,)
where R0: Resource,

Source§

type Destination = Either1<<R0 as Resource>::Destination>

Source§

type RequestBody = <R0 as Resource>::RequestBody

Source§

type Buf = Either1<<R0 as Resource>::Buf>

Source§

type Body = Either1<<R0 as Resource>::Body>

Source§

type Future = Either1<<R0 as Resource>::Future>

Source§

fn dispatch( &mut self, destination: Self::Destination, route_match: &RouteMatch<'_>, body: Self::RequestBody, ) -> Self::Future

Source§

impl<R0, R1> Resource for (R0, R1)
where R0: Resource, R1: Resource<RequestBody = R0::RequestBody>,

Source§

type Destination = Either2<<R0 as Resource>::Destination, <R1 as Resource>::Destination>

Source§

type RequestBody = <R0 as Resource>::RequestBody

Source§

type Buf = Either2<<R0 as Resource>::Buf, <R1 as Resource>::Buf>

Source§

type Body = Either2<<R0 as Resource>::Body, <R1 as Resource>::Body>

Source§

type Future = Either2<<R0 as Resource>::Future, <R1 as Resource>::Future>

Source§

fn dispatch( &mut self, destination: Self::Destination, route_match: &RouteMatch<'_>, body: Self::RequestBody, ) -> Self::Future

Source§

impl<R0, R1, R2> Resource for (R0, R1, R2)
where R0: Resource, R1: Resource<RequestBody = R0::RequestBody>, R2: Resource<RequestBody = R0::RequestBody>,

Source§

type Destination = Either3<<R0 as Resource>::Destination, <R1 as Resource>::Destination, <R2 as Resource>::Destination>

Source§

type RequestBody = <R0 as Resource>::RequestBody

Source§

type Buf = Either3<<R0 as Resource>::Buf, <R1 as Resource>::Buf, <R2 as Resource>::Buf>

Source§

type Body = Either3<<R0 as Resource>::Body, <R1 as Resource>::Body, <R2 as Resource>::Body>

Source§

type Future = Either3<<R0 as Resource>::Future, <R1 as Resource>::Future, <R2 as Resource>::Future>

Source§

fn dispatch( &mut self, destination: Self::Destination, route_match: &RouteMatch<'_>, body: Self::RequestBody, ) -> Self::Future

Source§

impl<R0, R1, R2, R3> Resource for (R0, R1, R2, R3)
where R0: Resource, R1: Resource<RequestBody = R0::RequestBody>, R2: Resource<RequestBody = R0::RequestBody>, R3: Resource<RequestBody = R0::RequestBody>,

Source§

type Destination = Either4<<R0 as Resource>::Destination, <R1 as Resource>::Destination, <R2 as Resource>::Destination, <R3 as Resource>::Destination>

Source§

type RequestBody = <R0 as Resource>::RequestBody

Source§

type Buf = Either4<<R0 as Resource>::Buf, <R1 as Resource>::Buf, <R2 as Resource>::Buf, <R3 as Resource>::Buf>

Source§

type Body = Either4<<R0 as Resource>::Body, <R1 as Resource>::Body, <R2 as Resource>::Body, <R3 as Resource>::Body>

Source§

type Future = Either4<<R0 as Resource>::Future, <R1 as Resource>::Future, <R2 as Resource>::Future, <R3 as Resource>::Future>

Source§

fn dispatch( &mut self, destination: Self::Destination, route_match: &RouteMatch<'_>, body: Self::RequestBody, ) -> Self::Future

Source§

impl<R0, R1, R2, R3, R4> Resource for (R0, R1, R2, R3, R4)
where R0: Resource, R1: Resource<RequestBody = R0::RequestBody>, R2: Resource<RequestBody = R0::RequestBody>, R3: Resource<RequestBody = R0::RequestBody>, R4: Resource<RequestBody = R0::RequestBody>,

Source§

type Destination = Either5<<R0 as Resource>::Destination, <R1 as Resource>::Destination, <R2 as Resource>::Destination, <R3 as Resource>::Destination, <R4 as Resource>::Destination>

Source§

type RequestBody = <R0 as Resource>::RequestBody

Source§

type Buf = Either5<<R0 as Resource>::Buf, <R1 as Resource>::Buf, <R2 as Resource>::Buf, <R3 as Resource>::Buf, <R4 as Resource>::Buf>

Source§

type Body = Either5<<R0 as Resource>::Body, <R1 as Resource>::Body, <R2 as Resource>::Body, <R3 as Resource>::Body, <R4 as Resource>::Body>

Source§

type Future = Either5<<R0 as Resource>::Future, <R1 as Resource>::Future, <R2 as Resource>::Future, <R3 as Resource>::Future, <R4 as Resource>::Future>

Source§

fn dispatch( &mut self, destination: Self::Destination, route_match: &RouteMatch<'_>, body: Self::RequestBody, ) -> Self::Future

Source§

impl<R0, R1, R2, R3, R4, R5> Resource for (R0, R1, R2, R3, R4, R5)
where R0: Resource, R1: Resource<RequestBody = R0::RequestBody>, R2: Resource<RequestBody = R0::RequestBody>, R3: Resource<RequestBody = R0::RequestBody>, R4: Resource<RequestBody = R0::RequestBody>, R5: Resource<RequestBody = R0::RequestBody>,

Source§

type Destination = Either6<<R0 as Resource>::Destination, <R1 as Resource>::Destination, <R2 as Resource>::Destination, <R3 as Resource>::Destination, <R4 as Resource>::Destination, <R5 as Resource>::Destination>

Source§

type RequestBody = <R0 as Resource>::RequestBody

Source§

type Buf = Either6<<R0 as Resource>::Buf, <R1 as Resource>::Buf, <R2 as Resource>::Buf, <R3 as Resource>::Buf, <R4 as Resource>::Buf, <R5 as Resource>::Buf>

Source§

type Body = Either6<<R0 as Resource>::Body, <R1 as Resource>::Body, <R2 as Resource>::Body, <R3 as Resource>::Body, <R4 as Resource>::Body, <R5 as Resource>::Body>

Source§

type Future = Either6<<R0 as Resource>::Future, <R1 as Resource>::Future, <R2 as Resource>::Future, <R3 as Resource>::Future, <R4 as Resource>::Future, <R5 as Resource>::Future>

Source§

fn dispatch( &mut self, destination: Self::Destination, route_match: &RouteMatch<'_>, body: Self::RequestBody, ) -> Self::Future

Source§

impl<R0, R1, R2, R3, R4, R5, R6> Resource for (R0, R1, R2, R3, R4, R5, R6)
where R0: Resource, R1: Resource<RequestBody = R0::RequestBody>, R2: Resource<RequestBody = R0::RequestBody>, R3: Resource<RequestBody = R0::RequestBody>, R4: Resource<RequestBody = R0::RequestBody>, R5: Resource<RequestBody = R0::RequestBody>, R6: Resource<RequestBody = R0::RequestBody>,

Source§

type Destination = Either7<<R0 as Resource>::Destination, <R1 as Resource>::Destination, <R2 as Resource>::Destination, <R3 as Resource>::Destination, <R4 as Resource>::Destination, <R5 as Resource>::Destination, <R6 as Resource>::Destination>

Source§

type RequestBody = <R0 as Resource>::RequestBody

Source§

type Buf = Either7<<R0 as Resource>::Buf, <R1 as Resource>::Buf, <R2 as Resource>::Buf, <R3 as Resource>::Buf, <R4 as Resource>::Buf, <R5 as Resource>::Buf, <R6 as Resource>::Buf>

Source§

type Body = Either7<<R0 as Resource>::Body, <R1 as Resource>::Body, <R2 as Resource>::Body, <R3 as Resource>::Body, <R4 as Resource>::Body, <R5 as Resource>::Body, <R6 as Resource>::Body>

Source§

type Future = Either7<<R0 as Resource>::Future, <R1 as Resource>::Future, <R2 as Resource>::Future, <R3 as Resource>::Future, <R4 as Resource>::Future, <R5 as Resource>::Future, <R6 as Resource>::Future>

Source§

fn dispatch( &mut self, destination: Self::Destination, route_match: &RouteMatch<'_>, body: Self::RequestBody, ) -> Self::Future

Source§

impl<R0, R1, R2, R3, R4, R5, R6, R7> Resource for (R0, R1, R2, R3, R4, R5, R6, R7)
where R0: Resource, R1: Resource<RequestBody = R0::RequestBody>, R2: Resource<RequestBody = R0::RequestBody>, R3: Resource<RequestBody = R0::RequestBody>, R4: Resource<RequestBody = R0::RequestBody>, R5: Resource<RequestBody = R0::RequestBody>, R6: Resource<RequestBody = R0::RequestBody>, R7: Resource<RequestBody = R0::RequestBody>,

Source§

type Destination = Either8<<R0 as Resource>::Destination, <R1 as Resource>::Destination, <R2 as Resource>::Destination, <R3 as Resource>::Destination, <R4 as Resource>::Destination, <R5 as Resource>::Destination, <R6 as Resource>::Destination, <R7 as Resource>::Destination>

Source§

type RequestBody = <R0 as Resource>::RequestBody

Source§

type Buf = Either8<<R0 as Resource>::Buf, <R1 as Resource>::Buf, <R2 as Resource>::Buf, <R3 as Resource>::Buf, <R4 as Resource>::Buf, <R5 as Resource>::Buf, <R6 as Resource>::Buf, <R7 as Resource>::Buf>

Source§

type Body = Either8<<R0 as Resource>::Body, <R1 as Resource>::Body, <R2 as Resource>::Body, <R3 as Resource>::Body, <R4 as Resource>::Body, <R5 as Resource>::Body, <R6 as Resource>::Body, <R7 as Resource>::Body>

Source§

type Future = Either8<<R0 as Resource>::Future, <R1 as Resource>::Future, <R2 as Resource>::Future, <R3 as Resource>::Future, <R4 as Resource>::Future, <R5 as Resource>::Future, <R6 as Resource>::Future, <R7 as Resource>::Future>

Source§

fn dispatch( &mut self, destination: Self::Destination, route_match: &RouteMatch<'_>, body: Self::RequestBody, ) -> Self::Future

Source§

impl<R0, R1, R2, R3, R4, R5, R6, R7, R8> Resource for (R0, R1, R2, R3, R4, R5, R6, R7, R8)
where R0: Resource, R1: Resource<RequestBody = R0::RequestBody>, R2: Resource<RequestBody = R0::RequestBody>, R3: Resource<RequestBody = R0::RequestBody>, R4: Resource<RequestBody = R0::RequestBody>, R5: Resource<RequestBody = R0::RequestBody>, R6: Resource<RequestBody = R0::RequestBody>, R7: Resource<RequestBody = R0::RequestBody>, R8: Resource<RequestBody = R0::RequestBody>,

Source§

type Destination = Either9<<R0 as Resource>::Destination, <R1 as Resource>::Destination, <R2 as Resource>::Destination, <R3 as Resource>::Destination, <R4 as Resource>::Destination, <R5 as Resource>::Destination, <R6 as Resource>::Destination, <R7 as Resource>::Destination, <R8 as Resource>::Destination>

Source§

type RequestBody = <R0 as Resource>::RequestBody

Source§

type Buf = Either9<<R0 as Resource>::Buf, <R1 as Resource>::Buf, <R2 as Resource>::Buf, <R3 as Resource>::Buf, <R4 as Resource>::Buf, <R5 as Resource>::Buf, <R6 as Resource>::Buf, <R7 as Resource>::Buf, <R8 as Resource>::Buf>

Source§

type Body = Either9<<R0 as Resource>::Body, <R1 as Resource>::Body, <R2 as Resource>::Body, <R3 as Resource>::Body, <R4 as Resource>::Body, <R5 as Resource>::Body, <R6 as Resource>::Body, <R7 as Resource>::Body, <R8 as Resource>::Body>

Source§

type Future = Either9<<R0 as Resource>::Future, <R1 as Resource>::Future, <R2 as Resource>::Future, <R3 as Resource>::Future, <R4 as Resource>::Future, <R5 as Resource>::Future, <R6 as Resource>::Future, <R7 as Resource>::Future, <R8 as Resource>::Future>

Source§

fn dispatch( &mut self, destination: Self::Destination, route_match: &RouteMatch<'_>, body: Self::RequestBody, ) -> Self::Future

Source§

impl<R0, R1, R2, R3, R4, R5, R6, R7, R8, R9> Resource for (R0, R1, R2, R3, R4, R5, R6, R7, R8, R9)
where R0: Resource, R1: Resource<RequestBody = R0::RequestBody>, R2: Resource<RequestBody = R0::RequestBody>, R3: Resource<RequestBody = R0::RequestBody>, R4: Resource<RequestBody = R0::RequestBody>, R5: Resource<RequestBody = R0::RequestBody>, R6: Resource<RequestBody = R0::RequestBody>, R7: Resource<RequestBody = R0::RequestBody>, R8: Resource<RequestBody = R0::RequestBody>, R9: Resource<RequestBody = R0::RequestBody>,

Source§

type Destination = Either10<<R0 as Resource>::Destination, <R1 as Resource>::Destination, <R2 as Resource>::Destination, <R3 as Resource>::Destination, <R4 as Resource>::Destination, <R5 as Resource>::Destination, <R6 as Resource>::Destination, <R7 as Resource>::Destination, <R8 as Resource>::Destination, <R9 as Resource>::Destination>

Source§

type RequestBody = <R0 as Resource>::RequestBody

Source§

type Buf = Either10<<R0 as Resource>::Buf, <R1 as Resource>::Buf, <R2 as Resource>::Buf, <R3 as Resource>::Buf, <R4 as Resource>::Buf, <R5 as Resource>::Buf, <R6 as Resource>::Buf, <R7 as Resource>::Buf, <R8 as Resource>::Buf, <R9 as Resource>::Buf>

Source§

type Body = Either10<<R0 as Resource>::Body, <R1 as Resource>::Body, <R2 as Resource>::Body, <R3 as Resource>::Body, <R4 as Resource>::Body, <R5 as Resource>::Body, <R6 as Resource>::Body, <R7 as Resource>::Body, <R8 as Resource>::Body, <R9 as Resource>::Body>

Source§

type Future = Either10<<R0 as Resource>::Future, <R1 as Resource>::Future, <R2 as Resource>::Future, <R3 as Resource>::Future, <R4 as Resource>::Future, <R5 as Resource>::Future, <R6 as Resource>::Future, <R7 as Resource>::Future, <R8 as Resource>::Future, <R9 as Resource>::Future>

Source§

fn dispatch( &mut self, destination: Self::Destination, route_match: &RouteMatch<'_>, body: Self::RequestBody, ) -> Self::Future

Source§

impl<R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10> Resource for (R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10)
where R0: Resource, R1: Resource<RequestBody = R0::RequestBody>, R2: Resource<RequestBody = R0::RequestBody>, R3: Resource<RequestBody = R0::RequestBody>, R4: Resource<RequestBody = R0::RequestBody>, R5: Resource<RequestBody = R0::RequestBody>, R6: Resource<RequestBody = R0::RequestBody>, R7: Resource<RequestBody = R0::RequestBody>, R8: Resource<RequestBody = R0::RequestBody>, R9: Resource<RequestBody = R0::RequestBody>, R10: Resource<RequestBody = R0::RequestBody>,

Source§

type Destination = Either11<<R0 as Resource>::Destination, <R1 as Resource>::Destination, <R2 as Resource>::Destination, <R3 as Resource>::Destination, <R4 as Resource>::Destination, <R5 as Resource>::Destination, <R6 as Resource>::Destination, <R7 as Resource>::Destination, <R8 as Resource>::Destination, <R9 as Resource>::Destination, <R10 as Resource>::Destination>

Source§

type RequestBody = <R0 as Resource>::RequestBody

Source§

type Buf = Either11<<R0 as Resource>::Buf, <R1 as Resource>::Buf, <R2 as Resource>::Buf, <R3 as Resource>::Buf, <R4 as Resource>::Buf, <R5 as Resource>::Buf, <R6 as Resource>::Buf, <R7 as Resource>::Buf, <R8 as Resource>::Buf, <R9 as Resource>::Buf, <R10 as Resource>::Buf>

Source§

type Body = Either11<<R0 as Resource>::Body, <R1 as Resource>::Body, <R2 as Resource>::Body, <R3 as Resource>::Body, <R4 as Resource>::Body, <R5 as Resource>::Body, <R6 as Resource>::Body, <R7 as Resource>::Body, <R8 as Resource>::Body, <R9 as Resource>::Body, <R10 as Resource>::Body>

Source§

type Future = Either11<<R0 as Resource>::Future, <R1 as Resource>::Future, <R2 as Resource>::Future, <R3 as Resource>::Future, <R4 as Resource>::Future, <R5 as Resource>::Future, <R6 as Resource>::Future, <R7 as Resource>::Future, <R8 as Resource>::Future, <R9 as Resource>::Future, <R10 as Resource>::Future>

Source§

fn dispatch( &mut self, destination: Self::Destination, route_match: &RouteMatch<'_>, body: Self::RequestBody, ) -> Self::Future

Source§

impl<R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11> Resource for (R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11)
where R0: Resource, R1: Resource<RequestBody = R0::RequestBody>, R2: Resource<RequestBody = R0::RequestBody>, R3: Resource<RequestBody = R0::RequestBody>, R4: Resource<RequestBody = R0::RequestBody>, R5: Resource<RequestBody = R0::RequestBody>, R6: Resource<RequestBody = R0::RequestBody>, R7: Resource<RequestBody = R0::RequestBody>, R8: Resource<RequestBody = R0::RequestBody>, R9: Resource<RequestBody = R0::RequestBody>, R10: Resource<RequestBody = R0::RequestBody>, R11: Resource<RequestBody = R0::RequestBody>,

Source§

type Destination = Either12<<R0 as Resource>::Destination, <R1 as Resource>::Destination, <R2 as Resource>::Destination, <R3 as Resource>::Destination, <R4 as Resource>::Destination, <R5 as Resource>::Destination, <R6 as Resource>::Destination, <R7 as Resource>::Destination, <R8 as Resource>::Destination, <R9 as Resource>::Destination, <R10 as Resource>::Destination, <R11 as Resource>::Destination>

Source§

type RequestBody = <R0 as Resource>::RequestBody

Source§

type Buf = Either12<<R0 as Resource>::Buf, <R1 as Resource>::Buf, <R2 as Resource>::Buf, <R3 as Resource>::Buf, <R4 as Resource>::Buf, <R5 as Resource>::Buf, <R6 as Resource>::Buf, <R7 as Resource>::Buf, <R8 as Resource>::Buf, <R9 as Resource>::Buf, <R10 as Resource>::Buf, <R11 as Resource>::Buf>

Source§

type Body = Either12<<R0 as Resource>::Body, <R1 as Resource>::Body, <R2 as Resource>::Body, <R3 as Resource>::Body, <R4 as Resource>::Body, <R5 as Resource>::Body, <R6 as Resource>::Body, <R7 as Resource>::Body, <R8 as Resource>::Body, <R9 as Resource>::Body, <R10 as Resource>::Body, <R11 as Resource>::Body>

Source§

type Future = Either12<<R0 as Resource>::Future, <R1 as Resource>::Future, <R2 as Resource>::Future, <R3 as Resource>::Future, <R4 as Resource>::Future, <R5 as Resource>::Future, <R6 as Resource>::Future, <R7 as Resource>::Future, <R8 as Resource>::Future, <R9 as Resource>::Future, <R10 as Resource>::Future, <R11 as Resource>::Future>

Source§

fn dispatch( &mut self, destination: Self::Destination, route_match: &RouteMatch<'_>, body: Self::RequestBody, ) -> Self::Future

Implementors§