use axum::{
http::{header, StatusCode},
response::{IntoResponse, Response},
};
#[derive(rust_embed::Embed)]
#[folder = "ui/"]
#[prefix = "dashboard/"]
struct Assets;
pub async fn handle_dashboard(uri: axum::http::Uri) -> Response {
let path = uri.path().trim_start_matches('/');
if let Some(content) = Assets::get(path) {
return serve_asset(content);
}
if !path.ends_with(".html") {
let with_html = format!("{path}.html");
if let Some(content) = Assets::get(&with_html) {
return serve_asset(content);
}
}
if let Some(content) = Assets::get("dashboard/index.html") {
return serve_asset(content);
}
StatusCode::NOT_FOUND.into_response()
}
fn serve_asset(content: rust_embed::EmbeddedFile) -> Response {
let mime: header::HeaderValue = content
.metadata
.mimetype()
.parse()
.unwrap_or_else(|_| header::HeaderValue::from_static("application/octet-stream"));
([(header::CONTENT_TYPE, mime)], content.data.to_vec()).into_response()
}