embystream 0.0.28

Another Emby streaming application (frontend/backend separation) written in Rust.
Documentation
use std::{convert::Infallible, pin::Pin, sync::Arc};

use http_serde::http::{Request, Response};
use hyper::{body::Incoming, service::Service};

use super::{
    BoxBodyType, Middleware,
    chain::{Chain, Handler},
};

#[derive(Clone)]
pub struct Svc {
    handler: Handler,
    middlewares: Arc<Vec<Box<dyn Middleware>>>,
}

impl Svc {
    pub fn new(
        handler: Handler,
        middlewares: Arc<Vec<Box<dyn Middleware>>>,
    ) -> Self {
        Self {
            handler,
            middlewares,
        }
    }
}

impl Service<Request<Incoming>> for Svc {
    type Response = Response<BoxBodyType>;
    type Error = Infallible;
    type Future = Pin<
        Box<dyn Future<Output = Result<Self::Response, Self::Error>> + Send>,
    >;

    fn call(&self, req: Request<Incoming>) -> Self::Future {
        let handler = self.handler.clone();
        let middlewares = self.middlewares.clone();

        Box::pin(async move {
            let chain = Chain::new(middlewares.to_vec(), handler);
            let response = chain.run(req).await;
            Ok(response)
        })
    }
}