toni 0.1.1

Fast and modular web framework for scalable applications
Documentation
use std::sync::Arc;

use anyhow::Result;

use crate::http_helpers::{HttpRequest, HttpResponse, IntoResponse};
use crate::traits_helpers::ControllerTrait;

pub trait RouteAdapter {
    type Request;
    type Response;

    fn adapt_request(request: Self::Request) -> impl Future<Output = Result<HttpRequest>>;

    fn adapt_response(
        response: Box<dyn IntoResponse<Response = HttpResponse>>,
    ) -> Result<Self::Response>;

    fn handle_request(
        request: Self::Request,
        controller: Arc<Box<dyn ControllerTrait>>,
    ) -> impl Future<Output = Result<Self::Response>> {
        async move {
            let http_request = Self::adapt_request(request).await?;
            let http_response = controller.execute(http_request).await;
            Self::adapt_response(http_response)
        }
    }
}