mirror of
https://github.com/Djeeberjr/fw-anwesenheit.git
synced 2025-07-31 13:54:18 +00:00
added static assets on webserver
This commit is contained in:
parent
161ebf9bd2
commit
fe6540ca3d
30
Cargo.lock
generated
30
Cargo.lock
generated
@ -266,6 +266,19 @@ dependencies = [
|
||||
"crypto-common",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "dir-embed"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "322ab0f130706b5a06c6f0fe92e7d6453ed0829779d7545a054e291684971712"
|
||||
dependencies = [
|
||||
"mime",
|
||||
"mime_guess",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.104",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "document-features"
|
||||
version = "0.2.11"
|
||||
@ -986,6 +999,7 @@ dependencies = [
|
||||
"bleps",
|
||||
"chrono",
|
||||
"critical-section",
|
||||
"dir-embed",
|
||||
"ds3231",
|
||||
"edge-dhcp",
|
||||
"edge-nal",
|
||||
@ -1235,6 +1249,22 @@ version = "2.7.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
|
||||
|
||||
[[package]]
|
||||
name = "mime"
|
||||
version = "0.3.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
|
||||
|
||||
[[package]]
|
||||
name = "mime_guess"
|
||||
version = "2.0.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e"
|
||||
dependencies = [
|
||||
"mime",
|
||||
"unicase",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nb"
|
||||
version = "0.1.3"
|
||||
|
@ -59,10 +59,10 @@ edge-nal = "0.5.0"
|
||||
edge-nal-embassy = { version = "0.6.0", features = ["log"] }
|
||||
picoserve = { version = "0.16.0", features = ["embassy", "log"] }
|
||||
embassy-sync = { version = "0.7.0", features = ["log"] }
|
||||
|
||||
ds3231 = { version = "0.3.0", features = ["async", "temperature_f32"] }
|
||||
ws2812-spi = "0.5.1"
|
||||
chrono = { version = "0.4.41", default-features = false }
|
||||
dir-embed = "0.3.0"
|
||||
|
||||
[profile.dev]
|
||||
# Rust debug is too slow.
|
||||
|
77
src/webserver/assets.rs
Normal file
77
src/webserver/assets.rs
Normal file
@ -0,0 +1,77 @@
|
||||
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
|
||||
}
|
||||
}
|
@ -4,6 +4,8 @@ use embassy_time::Duration;
|
||||
use picoserve::{AppBuilder, AppRouter, routing::get};
|
||||
use static_cell::make_static;
|
||||
|
||||
mod assets;
|
||||
|
||||
pub fn start_webserver(spawner: &mut Spawner, stack: Stack<'static>) {
|
||||
let app = make_static!(AppProps.build_app());
|
||||
|
||||
@ -23,7 +25,7 @@ impl AppBuilder for AppProps {
|
||||
type PathRouter = impl picoserve::routing::PathRouter;
|
||||
|
||||
fn build_app(self) -> picoserve::Router<Self::PathRouter> {
|
||||
picoserve::Router::new().route("/", get(|| async move { "Hello World" }))
|
||||
picoserve::Router::from_service(assets::Assets).route("/api/a", get(async move || "Hello"))
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user