use std::sync::Arc;
use axum::{
extract::Request,
http::{header, StatusCode},
response::{IntoResponse, Response},
};
use rust_embed::Embed;
use super::AppState;
#[derive(Embed)]
#[folder = "embedded-app/"]
#[include = "*.html"]
#[include = "*.js"]
#[include = "*.css"]
#[include = "*.wasm"]
#[include = "*.svg"]
#[include = "*.png"]
#[include = "*.ico"]
#[include = "*.json"]
#[include = "assets/*"]
struct WebAssets;
pub async fn static_handler(
axum::extract::State(_state): axum::extract::State<Arc<AppState>>,
request: Request,
) -> Response {
let path = request.uri().path().trim_start_matches('/');
if let Some(content) = <WebAssets as Embed>::get(path) {
return serve_file(path, content.data.as_ref());
}
if !path.contains('.') || path.is_empty() {
if let Some(content) = <WebAssets as Embed>::get("index.html") {
return serve_file("index.html", content.data.as_ref());
}
}
(StatusCode::NOT_FOUND, "Not Found").into_response()
}
fn serve_file(path: &str, data: &[u8]) -> Response {
let mime = mime_guess::from_path(path).first_or_octet_stream();
(
StatusCode::OK,
[(header::CONTENT_TYPE, mime.as_ref())],
data.to_vec(),
)
.into_response()
}