use crate::core::app::{Template, TeraWeb};
use actix_web::{
HttpRequest, HttpResponse, Responder,
body::BoxBody,
http::{StatusCode, header::ContentType},
web,
web::ServiceConfig,
};
use futures_util::stream;
pub mod dev;
impl Responder for Template {
type Body = BoxBody;
fn respond_to(self, _req: &HttpRequest) -> HttpResponse<Self::Body> {
let result = self.app_state.render_with_context(&self.template_name, self.context);
let body_stream = stream::once(async {
result
.map(|s| s.into()) .map_err(|e| {
log::error!("Template rendering error: {:?}", e);
actix_web::error::ErrorInternalServerError(e)
})
});
HttpResponse::build(StatusCode::OK)
.content_type(ContentType::html())
.streaming(body_stream)
}
}
#[cfg(feature = "devel")]
impl TeraWeb {
pub fn configure_routes(&self, cfg: &mut ServiceConfig) {
log::info!(
"🔥 SnapFire devel enabled. Attaching WebSocket at {}",
self.reloader.ws_path
);
let broadcaster = self.get_reloader_broadcaster();
cfg.route(
&self.reloader.ws_path,
web::get().to(move |req, stream| {
dev::ws::websocket_handler(req, stream, broadcaster.clone())
}),
);
}
}
#[cfg(not(feature = "devel"))]
impl TeraWeb {
pub fn configure_routes(&self, _cfg: &mut ServiceConfig) {
}
}