mirror of
				https://github.com/Djeeberjr/fw-anwesenheit.git
				synced 2025-11-04 07:34:10 +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