mirror of
https://github.com/Djeeberjr/fw-anwesenheit.git
synced 2025-08-02 14:54:16 +00:00
78 lines
2.2 KiB
Rust
78 lines
2.2 KiB
Rust
use dir_embed::Embed;
|
|
use picoserve::response::Content;
|
|
|
|
#[derive(Embed)]
|
|
#[dir = "../../web/dist"]
|
|
#[mode = "mime"]
|
|
pub struct Assets;
|
|
|
|
impl<State, CurrentPathParameters>
|
|
picoserve::routing::PathRouterService<State, CurrentPathParameters> for Assets
|
|
{
|
|
async fn call_request_handler_service<
|
|
R: picoserve::io::embedded_io_async::Read,
|
|
W: picoserve::response::ResponseWriter<Error = R::Error>,
|
|
>(
|
|
&self,
|
|
state: &State,
|
|
current_path_parameters: CurrentPathParameters,
|
|
path: picoserve::request::Path<'_>,
|
|
request: picoserve::request::Request<'_, R>,
|
|
response_writer: W,
|
|
) -> Result<picoserve::ResponseSent, W::Error> {
|
|
let requested_path = path.encoded();
|
|
|
|
let requested_file = if requested_path == "/" {
|
|
Self::get("index.html")
|
|
} else if let Some(striped_path) = requested_path.strip_prefix("/") {
|
|
Self::get(striped_path)
|
|
} else {
|
|
None
|
|
};
|
|
|
|
match requested_file {
|
|
Some(content) => {
|
|
let response = picoserve::response::Response::new(
|
|
picoserve::response::StatusCode::OK,
|
|
StaticAsset(content.0, content.1),
|
|
);
|
|
|
|
response_writer
|
|
.write_response(request.body_connection.finalize().await.unwrap(), response)
|
|
.await
|
|
}
|
|
None => {
|
|
use picoserve::routing::PathRouter;
|
|
picoserve::routing::NotFound
|
|
.call_path_router(
|
|
state,
|
|
current_path_parameters,
|
|
path,
|
|
request,
|
|
response_writer,
|
|
)
|
|
.await
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
struct StaticAsset(pub &'static [u8], pub &'static str);
|
|
|
|
impl Content for StaticAsset {
|
|
fn content_type(&self) -> &'static str {
|
|
self.1
|
|
}
|
|
|
|
fn content_length(&self) -> usize {
|
|
self.0.len()
|
|
}
|
|
|
|
async fn write_content<W: embedded_io_async::Write>(
|
|
self,
|
|
mut writer: W,
|
|
) -> Result<(), W::Error> {
|
|
writer.write_all(self.0).await
|
|
}
|
|
}
|