Struct HandlerService

pub struct HandlerService<H, T, S> { /* private fields */ }

An adapter that makes a Handler into a Service.

Created with Handler::with_state or HandlerWithoutStateExt::into_service.

Implementations

impl<H, T, S> HandlerService<H, T, S>

fn state(&self) -> &S

Get a reference to the state.

fn into_make_service(self) -> IntoMakeService<HandlerService<H, T, S>>

Convert the handler into a MakeService.

This allows you to serve a single handler if you don't need any routing:

use axum::{
    handler::Handler,
    extract::State,
    http::{Uri, Method},
    response::IntoResponse,
};
use std::net::SocketAddr;

#[derive(Clone)]
struct AppState {}

async fn handler(State(state): State<AppState>) {
    // ...
}

let app = handler.with_state(AppState {});

# async {
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app.into_make_service()).await.unwrap();
# };
fn into_make_service_with_connect_info<C>(self) -> IntoMakeServiceWithConnectInfo<HandlerService<H, T, S>, C>

Convert the handler into a MakeService which stores information about the incoming connection.

See Router::into_make_service_with_connect_info for more details.

use axum::{
    handler::Handler,
    response::IntoResponse,
    extract::{ConnectInfo, State},
};
use std::net::SocketAddr;

#[derive(Clone)]
struct AppState {};

async fn handler(
    ConnectInfo(addr): ConnectInfo<SocketAddr>,
    State(state): State<AppState>,
) -> String {
    format!("Hello {addr}")
}

let app = handler.with_state(AppState {});

# async {
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(
    listener,
    app.into_make_service_with_connect_info::<SocketAddr>(),
).await.unwrap();
# };

Trait Implementations

impl<H, T, S> Clone for HandlerService<H, T, S> where H: Clone, S: Clone,

fn clone(&self) -> Self

impl<H, T, S> Debug for HandlerService<H, T, S>

fn fmt(&self, f: &mut Formatter<'_>) -> Result

impl<H, T, S, B> Service<Request<B>> for HandlerService<H, T, S> where H: Handler<T, S> + Clone + Send + 'static, B: HttpBody<Data = Bytes> + Send + 'static, B::Error: Into<BoxError>, S: Clone + Send + Sync,

type Response = Response<Body>;
type Error = never;
type Future = IntoServiceFuture<<H as Handler<T, S>>::Future>;
fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>>
fn call(&mut self, req: Request<B>) -> Self::Future

impl<H, T, S, L> Service<IncomingStream<'_, L>> for HandlerService<H, T, S> where H: Clone, S: Clone, L: Listener,

type Response = HandlerService<H, T, S>;
type Error = never;
type Future = Ready<Result<<HandlerService<H, T, S> as Service<IncomingStream<'_, L>>>::Response, <HandlerService<H, T, S> as Service<IncomingStream<'_, L>>>::Error>>;
fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>>
fn call(&mut self, _req: IncomingStream<'_, L>) -> Self::Future

Auto Trait Implementations

impl<H, T, S> Freeze for HandlerService<H, T, S> where H: Freeze, S: Freeze, PhantomData<fn() -> T>: Freeze,

impl<H, T, S> RefUnwindSafe for HandlerService<H, T, S> where H: RefUnwindSafe, S: RefUnwindSafe, PhantomData<fn() -> T>: RefUnwindSafe,

impl<H, T, S> Send for HandlerService<H, T, S> where H: Send, S: Send, PhantomData<fn() -> T>: Send,

impl<H, T, S> Sync for HandlerService<H, T, S> where H: Sync, S: Sync, PhantomData<fn() -> T>: Sync,

impl<H, T, S> Unpin for HandlerService<H, T, S> where H: Unpin, S: Unpin, PhantomData<fn() -> T>: Unpin,

impl<H, T, S> UnsafeUnpin for HandlerService<H, T, S> where H: UnsafeUnpin, S: UnsafeUnpin, PhantomData<fn() -> T>: UnsafeUnpin,

impl<H, T, S> UnwindSafe for HandlerService<H, T, S> where H: UnwindSafe, S: UnwindSafe, PhantomData<fn() -> T>: UnwindSafe,

Blanket Implementations

impl<C, Target> MakeConnection<Target> for HandlerService<H, T, S> where C: Service<Target>, <C as Service<Target>>::Response: AsyncRead + AsyncWrite,

type Connection = <C as Service<Target>>::Response;
type Error = <C as Service<Target>>::Error;
type Future = <C as Service<Target>>::Future;
fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), <C as MakeConnection<Target>>::Error>>
fn make_connection(&mut self, target: Target) -> <C as MakeConnection<Target>>::Future

impl<M, S, Target, Request> MakeService<Target, Request> for HandlerService<H, T, S> where M: Service<Target, Response = S>, S: Service<Request>,

type Response = <S as Service<Request>>::Response;
type Error = <S as Service<Request>>::Error;
type Service = S;
type MakeError = <M as Service<Target>>::Error;
type Future = <M as Service<Target>>::Future;
fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), <M as MakeService<Target, Request>>::MakeError>>
fn make_service(&mut self, target: Target) -> <M as MakeService<Target, Request>>::Future

impl<S, R> ServiceExt<R> for HandlerService<H, T, S> where S: Service<R>,

fn into_make_service(self) -> IntoMakeService<S>
fn into_make_service_with_connect_info<C>(self) -> IntoMakeServiceWithConnectInfo<S, C>

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for HandlerService<H, T, S> where ST: ?Sized, DT: ?Sized,

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for HandlerService<H, T, S> where ST: ?Sized, DT: ?Sized,

impl<T> Any for HandlerService<H, T, S> where T: 'static + ?Sized,

fn type_id(&self) -> TypeId

impl<T> Borrow<T> for HandlerService<H, T, S> where T: ?Sized,

fn borrow(&self) -> &T

impl<T> BorrowMut<T> for HandlerService<H, T, S> where T: ?Sized,

fn borrow_mut(&mut self) -> &mut T

impl<T> CloneToUninit for HandlerService<H, T, S> where T: Clone,

unsafe fn clone_to_uninit(&self, dest: *mut u8)

impl<T> From<T> for HandlerService<H, T, S>

fn from(t: T) -> T

Returns the argument unchanged.

impl<T> FromRef<T> for HandlerService<H, T, S> where T: Clone,

fn from_ref(input: &T) -> T

impl<T> Instrument for HandlerService<H, T, S>

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

impl<T> Same for HandlerService<H, T, S>

type Output = T;

impl<T> ToOwned for HandlerService<H, T, S> where T: Clone,

type Owned = T;
fn to_owned(&self) -> T
fn clone_into(&self, target: &mut T)

impl<T> WithSubscriber for HandlerService<H, T, S>

impl<T, Request> ServiceExt<Request> for HandlerService<H, T, S> where T: Service<Request> + ?Sized,

impl<T, U> Into<U> for HandlerService<H, T, S> where U: From<T>,

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of [From]<T> for U chooses to do.

impl<T, U> TryFrom<U> for HandlerService<H, T, S> where U: Into<T>,

type Error = never;
fn try_from(value: U) -> Result<T, never>

impl<T, U> TryInto<U> for HandlerService<H, T, S> where U: TryFrom<T>,

type Error = <U as TryFrom<T>>::Error;
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

impl<V, T> VZip<V> for HandlerService<H, T, S> where V: MultiLane<T>,

fn vzip(self) -> V