use async_trait::async_trait;
use reinhardt_http::{Handler, Request, Response, Result};
#[cfg(feature = "viewsets")]
use reinhardt_views::viewsets::{Action, ViewSet};
#[cfg(feature = "viewsets")]
use std::sync::Arc;
#[cfg(feature = "viewsets")]
pub(crate) struct ViewSetHandler {
pub viewset: Arc<dyn ViewSet>,
pub action: Action,
}
#[cfg(feature = "viewsets")]
#[async_trait]
impl Handler for ViewSetHandler {
async fn handle(&self, req: Request) -> Result<Response> {
self.viewset.dispatch(req, self.action.clone()).await
}
}
pub struct FunctionHandler<F> {
pub func: F,
}
#[async_trait]
impl<F, Fut> Handler for FunctionHandler<F>
where
F: Fn(Request) -> Fut + Send + Sync,
Fut: std::future::Future<Output = Result<Response>> + Send,
{
async fn handle(&self, req: Request) -> Result<Response> {
(self.func)(req).await
}
}