use std::error::Error as StdError;
use std::fmt;
use std::future::Future;
use std::marker::PhantomData;
use crate ::body::Body;
use crate ::service::service::Service;
use crate ::{Request, Response};
/// Create a `Service` from a function.
///
/// # Example
///
/// ```
/// use bytes::Bytes;
/// use hyper::{body, Request, Response, Version};
/// use http_body_util::Full;
/// use hyper::service::service_fn;
///
/// let service = service_fn(|req: Request<body::Incoming>| async move {
/// if req.version() == Version::HTTP_11 {
/// Ok(Response::new(Full::<Bytes>::from("Hello World")))
/// } else {
/// // Note: it's usually better to return a Response
/// // with an appropriate StatusCode instead of an Err.
/// Err("not HTTP/1.1, abort connection")
/// }
/// });
/// ```
pub fn service_fn<F, R, S>(f: F) -> ServiceFn<F, R>
where
F: Fn (Request<R>) -> S,
S: Future,
{
ServiceFn {
f,
_req: PhantomData,
}
}
/// Service returned by [`service_fn`]
pub struct ServiceFn<F, R> {
f: F,
_req: PhantomData<fn (R)>,
}
impl <F, ReqBody, Ret, ResBody, E> Service<Request<ReqBody>> for ServiceFn<F, ReqBody>
where
F: Fn (Request<ReqBody>) -> Ret,
ReqBody: Body,
Ret: Future<Output = Result<Response<ResBody>, E>>,
E: Into<Box <dyn StdError + Send + Sync>>,
ResBody: Body,
{
type Response = crate ::Response<ResBody>;
type Error = E;
type Future = Ret;
fn call(&self , req: Request<ReqBody>) -> Self ::Future {
(self .f)(req)
}
}
impl <F, R> fmt::Debug for ServiceFn<F, R> {
fn fmt(&self , f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("impl Service" ).finish()
}
}
impl <F, R> Clone for ServiceFn<F, R>
where
F: Clone,
{
fn clone(&self ) -> Self {
ServiceFn {
f: self .f.clone(),
_req: PhantomData,
}
}
}
impl <F, R> Copy for ServiceFn<F, R> where F: Copy {}
Messung V0.5 in Prozent C=85 H=95 G=90
¤ Dauer der Verarbeitung: 0.3 Sekunden
¤
*© Formatika GbR, Deutschland