froodi 1.0.0-beta.18

An ergonomic Rust IoC container
Documentation
use super::base::Service;

#[inline]
#[must_use]
pub(crate) const fn service_fn<T>(f: T) -> ServiceFn<T> {
    ServiceFn { f }
}

#[derive(Clone)]
pub(crate) struct ServiceFn<T> {
    f: T,
}

impl<F, Request, Response, Error> Service<Request> for ServiceFn<F>
where
    F: FnMut(Request) -> Result<Response, Error>,
{
    type Response = Response;
    type Error = Error;

    #[inline]
    fn call(&mut self, request: Request) -> Result<Self::Response, Self::Error> {
        (self.f)(request)
    }
}

#[cfg(test)]
mod tests {
    use core::convert::Infallible;

    use super::{service_fn, Service as _};

    #[derive(Clone, Copy)]
    struct Request(bool);
    struct Response(bool);

    #[test]
    fn test_service() {
        let mut service = service_fn(|Request(val)| Ok::<_, Infallible>(Response(val)));

        let request = Request(true);
        let response = service.call(request).unwrap();

        assert_eq!(request.0, response.0);
    }
}