1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
use axum::{
http::{header, StatusCode},
response::{IntoResponse, Response},
};
use mime_guess::Mime;
use rust_embed::EmbeddedFile;
use crate::{error::Internal, ui::error::NotFound};
#[derive(rust_embed::Embed)]
#[folder = "target/ui"]
pub struct Assets;
impl Assets {
pub fn load(path: impl AsRef<str>) -> Result<Asset, NotFound<String>> {
let path = path.as_ref();
let mime = mime_guess::from_path(path).first_or_octet_stream();
Self::get(path)
.map(|file| Asset(mime, file))
.ok_or(NotFound(format!("not found: {path}")))
}
pub fn index() -> Result<Asset, Internal> {
// "not found" in this case really is an internal error, as it should
// never happen. `index.html` is a known-valid path.
Ok(Self::load("index.html")?)
}
}
pub struct Asset(Mime, EmbeddedFile);
impl IntoResponse for Asset {
fn into_response(self) -> Response {
let Self(mime, file) = self;
(
StatusCode::OK,
[(header::CONTENT_TYPE, mime.as_ref())],
file.data,
)
.into_response()
}
}
|