use crate::{ws::Websocket, Error, HttpResponse, Request};
use http::Response;
use std::{future::Future, marker::PhantomData};
pub enum WebsocketUpgrade {}
impl WebsocketUpgrade {
pub fn from_req<THandler, TFut>(
_req: Request,
_handler: THandler,
) -> WebSocketUpgradeResponse<THandler, TFut>
where
THandler:
for<'a> FnOnce(Request, Box<dyn Websocket + Send>) -> TFut + Send + Sync + 'static,
TFut: Future<Output = ()> + Send + 'static,
{
WebSocketUpgradeResponse(PhantomData)
}
#[cfg(feature = "cookies")]
pub fn from_req_with_cookies<THandler, TFut>(
mut req: Request,
cookies: cookie::CookieJar,
handler: THandler,
) -> WebSocketUpgradeResponse<THandler, TFut>
where
THandler:
for<'a> FnOnce(Request, Box<dyn Websocket + Send>) -> TFut + Send + Sync + 'static,
TFut: Future<Output = ()> + Send + 'static,
{
WebSocketUpgradeResponse(PhantomData)
}
}
pub struct WebSocketUpgradeResponse<THandler, TFut>(PhantomData<(THandler, TFut)>)
where
THandler: for<'a> FnOnce(Request, Box<dyn Websocket + Send>) -> TFut + Send + Sync + 'static,
TFut: Future<Output = ()> + Send + 'static;
impl<THandler, TFut> HttpResponse for WebSocketUpgradeResponse<THandler, TFut>
where
THandler: for<'a> FnOnce(Request, Box<dyn Websocket + Send>) -> TFut + Send + Sync + 'static,
TFut: Future<Output = ()> + Send + 'static,
{
fn into_response(self) -> Result<Response<Vec<u8>>, Error> {
println!("[Error] Websocket upgrade not supported by current server.");
Ok(Response::builder().status(500).body(Vec::new())?)
}
}