use std::future::Future;
pub mod gzip;
pub mod http_error;
pub mod map_error;
pub mod metrics;
pub mod node;
pub mod proxy;
pub mod raw;
pub mod response_body;
pub mod retry;
pub mod root_span;
#[cfg(not(target_arch = "wasm32"))]
pub mod timeout;
#[cfg(not(target_arch = "wasm32"))]
pub mod tls_metrics;
pub mod trace_propagation;
pub mod user_agent;
pub mod wait_for_spans;
pub trait Service<R> {
type Response;
type Error;
async fn call(&self, req: R) -> Result<Self::Response, Self::Error>;
}
pub trait Layer<S> {
type Service;
fn layer(self, inner: S) -> Self::Service;
}
pub struct Identity;
impl<S> Layer<S> for Identity {
type Service = S;
fn layer(self, inner: S) -> Self::Service {
inner
}
}
pub struct Stack<T, U> {
inner: U,
outer: T,
}
impl<T, U, S> Layer<S> for Stack<T, U>
where
T: Layer<U::Service>,
U: Layer<S>,
{
type Service = T::Service;
fn layer(self, inner: S) -> Self::Service {
let inner = self.inner.layer(inner);
self.outer.layer(inner)
}
}
pub struct ServiceBuilder<L> {
layer: L,
}
impl ServiceBuilder<Identity> {
pub fn new() -> Self {
ServiceBuilder { layer: Identity }
}
}
impl<L> ServiceBuilder<L> {
pub fn layer<T>(self, layer: T) -> ServiceBuilder<Stack<L, T>> {
ServiceBuilder {
layer: Stack {
inner: layer,
outer: self.layer,
},
}
}
pub fn service<S>(self, service: S) -> L::Service
where
L: Layer<S>,
{
self.layer.layer(service)
}
}
#[cfg_attr(not(test), allow(dead_code))]
pub fn service_fn<T>(f: T) -> ServiceFn<T> {
ServiceFn(f)
}
pub struct ServiceFn<T>(T);
impl<T, R, F, S, E> Service<R> for ServiceFn<T>
where
T: Fn(R) -> F,
F: Future<Output = Result<S, E>>,
{
type Response = S;
type Error = E;
fn call(&self, req: R) -> impl Future<Output = Result<S, E>> {
(self.0)(req)
}
}