pub trait Handler: Send {
// Required method
fn handle(self, state: State) -> Pin<Box<HandlerFuture>>;
}Expand description
A Handler is an asynchronous function, taking a State value which represents the request
and related runtime state, and returns a future which resolves to a response.
This represents the common entry point for the parts of a Gotham application, and is used with
the Router API to describe how a request should be dispatched and handled.
The Handler is created and consumed by each request. In the most common case (a bare function
acting as a Handler) the Handler + Copy traits allow the Handler to be copied for each
request, and the copy consumed. For a closure or a custom handler, the NewHandler
implementation creates a Handler value for each request.
§Examples
The simplest kind of handler is a bare function which returns a synchronous response. This is useful when we don’t need to do any I/O before generating a response.
fn my_handler(_state: State) -> (State, Response<Body>) {
// Implementation elided.
}An asynchronous handler returns a HandlerFuture that will resolve to the response. For
example, this allows I/O work to begin, and for the Gotham app to continue generating a
response once the work completes.
fn async_handler(_state: State) -> Pin<Box<HandlerFuture>> {
// Implementation elided.
}A closure can implement Handler automatically, in the same way as a bare function. When
constructing a Handler in this way, a wrapping closure must also be used to implement the
NewHandler trait.
let new_handler = || {
let handler = |state: State| {
// Implementation elided.
};
Ok(handler)
};
// Pass `new_handler` to the router, using the `to_new_handler` API.A custom handler, which implements the NewHandler and Handler traits directly for greater
control. See the NewHandler trait for more examples of custom handlers.
#[derive(Copy, Clone)]
struct MyCustomHandler;
impl NewHandler for MyCustomHandler {
type Instance = Self;
fn new_handler(&self) -> anyhow::Result<Self::Instance> {
Ok(*self)
}
}
impl Handler for MyCustomHandler {
fn handle(self, _state: State) -> Pin<Box<HandlerFuture>> {
// Implementation elided.
}
}