From 44e2abfeaf24a8d06dbb9cd9d2c49a635b239f49 Mon Sep 17 00:00:00 2001 From: Niklas Kapelle Date: Tue, 29 Jul 2025 15:57:42 +0200 Subject: [PATCH 1/5] added picoserve feature The derived struct can now server as a PathRouter from picoserve --- Cargo.lock | 189 +++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 5 ++ src/lib.rs | 53 ++++++++++++++- 3 files changed, 246 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index e5d0ec7..e16f27c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,15 +2,141 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "const-sha1" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8a42181e0652c2997ae4d217f25b63c5337a52fd2279736e97b832fa0a3cff" + +[[package]] +name = "data-encoding" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" + [[package]] name = "dir-embed" version = "0.1.1" +dependencies = [ + "picoserve", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + +[[package]] +name = "embedded-io-async" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff09972d4073aa8c299395be75161d582e7629cd663171d62af73c8d50dba3f" +dependencies = [ + "embedded-io", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + +[[package]] +name = "heapless" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" +dependencies = [ + "hash32", + "serde", + "stable_deref_trait", +] + +[[package]] +name = "lhash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "744a4c881f502e98c2241d2e5f50040ac73b30194d64452bb6260393b53f0dc9" + +[[package]] +name = "picoserve" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33c13ee221d37df77538b033b831099235067c6a3fdcd2b80ef46c3d5b96e3b2" +dependencies = [ + "const-sha1", + "data-encoding", + "embedded-io-async", + "futures-util", + "heapless", + "lhash", + "picoserve_derive", + "ryu", + "serde", + "serde-json-core", + "thiserror", +] + +[[package]] +name = "picoserve_derive" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82a7350bdbef1ef80e4f058b89ca974dcc6526b04ac4d2095763b69760abf7ea" dependencies = [ "proc-macro2", "quote", "syn", ] +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + [[package]] name = "proc-macro2" version = "1.0.95" @@ -29,6 +155,49 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-json-core" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b81787e655bd59cecadc91f7b6b8651330b2be6c33246039a65e5cd6f4e0828" +dependencies = [ + "heapless", + "ryu", + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "syn" version = "2.0.104" @@ -40,6 +209,26 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "unicode-ident" version = "1.0.18" diff --git a/Cargo.toml b/Cargo.toml index 1700b72..98afb55 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,12 @@ readme = "README.md" [lib] proc-macro = true +[features] +default = [] +picoserve = ["dep:picoserve"] + [dependencies] +picoserve = {version = "0.16.0", optional = true } proc-macro2 = "1" quote = "1" syn = { version = "2", features = ["full"] } diff --git a/src/lib.rs b/src/lib.rs index 4c15494..a415930 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -61,11 +61,17 @@ pub fn embed(input: proc_macro::TokenStream) -> proc_macro::TokenStream { match_arms.push(arm); } - let expanded = match mode { + #[allow(unused_mut)] + let mut expanded = match mode { EmbedMode::Bytes => generate_byte_impl(struct_name, match_arms), EmbedMode::Str => generate_str_impl(struct_name, match_arms), }; + #[cfg(feature = "picoserve")] + { + expanded.extend(generate_picoserv_impl(struct_name)); + } + proc_macro::TokenStream::from(expanded) } @@ -163,3 +169,48 @@ fn generate_str_impl( } } } + +#[cfg(feature = "picoserve")] +fn generate_picoserv_impl(struct_name: &Ident) -> proc_macro2::TokenStream { + quote! { + impl picoserve::routing::PathRouterService for #struct_name { + async fn call_request_handler_service< + R: picoserve::io::embedded_io_async::Read, + W: picoserve::response::ResponseWriter, + >( + &self, + state: &State, + current_path_parameters: CurrentPathParameters, + path: picoserve::request::Path<'_>, + request: picoserve::request::Request<'_, R>, + response_writer: W, + ) -> Result { + let requested_path = path.encoded(); + + let requested_file = if requested_path.is_empty() { + 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, content); + + + 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 + } + } + } + } + } +} From 685c0071f6bdf3efd8690c8770b8f38574e9d50c Mon Sep 17 00:00:00 2001 From: Niklas Kapelle Date: Tue, 29 Jul 2025 15:59:20 +0200 Subject: [PATCH 2/5] added picoserve example --- examples/picoserve/.gitignore | 1 + examples/picoserve/Cargo.lock | 553 +++++++++++++++++++++++++++ examples/picoserve/Cargo.toml | 15 + examples/picoserve/src/main.rs | 55 +++ examples/picoserve/static/index.html | 14 + examples/picoserve/static/script.js | 3 + examples/picoserve/static/style.css | 27 ++ 7 files changed, 668 insertions(+) create mode 100644 examples/picoserve/.gitignore create mode 100644 examples/picoserve/Cargo.lock create mode 100644 examples/picoserve/Cargo.toml create mode 100644 examples/picoserve/src/main.rs create mode 100644 examples/picoserve/static/index.html create mode 100644 examples/picoserve/static/script.js create mode 100644 examples/picoserve/static/style.css diff --git a/examples/picoserve/.gitignore b/examples/picoserve/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/examples/picoserve/.gitignore @@ -0,0 +1 @@ +/target diff --git a/examples/picoserve/Cargo.lock b/examples/picoserve/Cargo.lock new file mode 100644 index 0000000..5800f28 --- /dev/null +++ b/examples/picoserve/Cargo.lock @@ -0,0 +1,553 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + +[[package]] +name = "bitflags" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cfg-if" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" + +[[package]] +name = "const-sha1" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8a42181e0652c2997ae4d217f25b63c5337a52fd2279736e97b832fa0a3cff" + +[[package]] +name = "data-encoding" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" + +[[package]] +name = "dir-embed" +version = "0.1.1" +dependencies = [ + "picoserve 0.16.0", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + +[[package]] +name = "embedded-io-async" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff09972d4073aa8c299395be75161d582e7629cd663171d62af73c8d50dba3f" +dependencies = [ + "embedded-io", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + +[[package]] +name = "heapless" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" +dependencies = [ + "hash32", + "serde", + "stable_deref_trait", +] + +[[package]] +name = "io-uring" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" +dependencies = [ + "bitflags", + "cfg-if", + "libc", +] + +[[package]] +name = "lhash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "744a4c881f502e98c2241d2e5f50040ac73b30194d64452bb6260393b53f0dc9" + +[[package]] +name = "libc" +version = "0.2.174" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" + +[[package]] +name = "lock_api" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "wasi", + "windows-sys", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "parking_lot" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "picoserve" +version = "0.1.0" +dependencies = [ + "dir-embed", + "picoserve 0.16.0", + "tokio", +] + +[[package]] +name = "picoserve" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33c13ee221d37df77538b033b831099235067c6a3fdcd2b80ef46c3d5b96e3b2" +dependencies = [ + "const-sha1", + "data-encoding", + "embedded-io-async", + "futures-util", + "heapless", + "lhash", + "picoserve_derive", + "ryu", + "serde", + "serde-json-core", + "thiserror", + "tokio", +] + +[[package]] +name = "picoserve_derive" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82a7350bdbef1ef80e4f058b89ca974dcc6526b04ac4d2095763b69760abf7ea" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +dependencies = [ + "bitflags", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-json-core" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b81787e655bd59cecadc91f7b6b8651330b2be6c33246039a65e5cd6f4e0828" +dependencies = [ + "heapless", + "ryu", + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "syn" +version = "2.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio" +version = "1.47.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35" +dependencies = [ + "backtrace", + "bytes", + "io-uring", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "slab", + "socket2", + "tokio-macros", + "windows-sys", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/examples/picoserve/Cargo.toml b/examples/picoserve/Cargo.toml new file mode 100644 index 0000000..9f15124 --- /dev/null +++ b/examples/picoserve/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "picoserve" +version = "0.1.0" +edition = "2024" + +[dependencies] +dir-embed = { path = "../../", features = ["picoserve"] } +picoserve = {version = "0.16.0", features = ["tokio"] } +tokio = { version = "1", features = ["full"] } + +[[bin]] +name = "picoserve" +path = "src/main.rs" + + diff --git a/examples/picoserve/src/main.rs b/examples/picoserve/src/main.rs new file mode 100644 index 0000000..162976d --- /dev/null +++ b/examples/picoserve/src/main.rs @@ -0,0 +1,55 @@ +use std::time::Duration; +use dir_embed::Embed; +use picoserve::routing::get; + +#[derive(Embed)] +#[dir = "../static"] +struct StaticStuff; + +#[tokio::main] +async fn main() { + let port = 8000; + + let app = std::rc::Rc::new( + picoserve::Router::new() + .route("/api/hello", get(|| async { "Hello World" })) + .nest_service("/", StaticStuff) + .nest_service("/static", StaticStuff), + ); + + let config = picoserve::Config::new(picoserve::Timeouts { + start_read_request: Some(Duration::from_secs(5)), + persistent_start_read_request: Some(Duration::from_secs(1)), + read_request: Some(Duration::from_secs(1)), + write: Some(Duration::from_secs(1)), + }) + .keep_connection_alive(); + + let socket = tokio::net::TcpListener::bind((std::net::Ipv4Addr::LOCALHOST, port)) + .await + .unwrap(); + + tokio::task::LocalSet::new() + .run_until(async { + loop { + let (stream, remote_address) = socket.accept().await.unwrap(); + + println!("Connection from {remote_address}"); + + let app = app.clone(); + let config = config.clone(); + + tokio::task::spawn_local(async move { + match picoserve::serve(&app, &config, &mut [0; 2048], stream).await { + Ok(handled_requests_count) => { + println!( + "{handled_requests_count} requests handled from {remote_address}" + ) + } + Err(err) => println!("{err:?}"), + } + }); + } + }) + .await +} diff --git a/examples/picoserve/static/index.html b/examples/picoserve/static/index.html new file mode 100644 index 0000000..f14597b --- /dev/null +++ b/examples/picoserve/static/index.html @@ -0,0 +1,14 @@ + + + + + Simple Static Example + + + +

Hello from Static!

+ +

+ + + diff --git a/examples/picoserve/static/script.js b/examples/picoserve/static/script.js new file mode 100644 index 0000000..ce5798f --- /dev/null +++ b/examples/picoserve/static/script.js @@ -0,0 +1,3 @@ +document.getElementById("clickMeBtn").addEventListener("click", function() { + document.getElementById("message").textContent = "You clicked the button!"; +}); diff --git a/examples/picoserve/static/style.css b/examples/picoserve/static/style.css new file mode 100644 index 0000000..e9aa661 --- /dev/null +++ b/examples/picoserve/static/style.css @@ -0,0 +1,27 @@ +body { + font-family: Arial, sans-serif; + background: #f7f8fa; + text-align: center; + margin-top: 100px; +} + +h1 { + color: #333; +} + +button { + padding: 10px 25px; + font-size: 16px; + cursor: pointer; + border-radius: 5px; + border: none; + background: #4e8cff; + color: white; + margin-top: 20px; +} + +#message { + margin-top: 30px; + color: #4e8cff; + font-weight: bold; +} From 659ab3f44752cdd107690b3efd296889e0d38634 Mon Sep 17 00:00:00 2001 From: Niklas Kapelle Date: Wed, 30 Jul 2025 00:53:05 +0200 Subject: [PATCH 3/5] implemented mime mode - required for picoserve - moved testdata --- Cargo.lock | 24 ++++++++++++ Cargo.toml | 2 + examples/picoserve/Cargo.lock | 24 ++++++++++++ examples/picoserve/src/main.rs | 2 + src/lib.rs | 55 +++++++++++++++++++++++---- testdata/bytes/bin | 1 + testdata/{ => bytes}/file1.txt | 0 testdata/bytes/index.html | 12 ++++++ testdata/{ => bytes}/sub/file2.txt | 0 testdata/str/file1.txt | 1 + testdata/str/sub/file2.txt | 1 + tests/byte.rs | 8 +++- tests/mime.rs | 61 ++++++++++++++++++++++++++++++ tests/str.rs | 2 +- 14 files changed, 183 insertions(+), 10 deletions(-) create mode 100644 testdata/bytes/bin rename testdata/{ => bytes}/file1.txt (100%) create mode 100644 testdata/bytes/index.html rename testdata/{ => bytes}/sub/file2.txt (100%) create mode 100644 testdata/str/file1.txt create mode 100644 testdata/str/sub/file2.txt create mode 100644 tests/mime.rs diff --git a/Cargo.lock b/Cargo.lock index e16f27c..2b98cab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -24,6 +24,8 @@ checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" name = "dir-embed" version = "0.1.1" dependencies = [ + "mime", + "mime_guess", "picoserve", "proc-macro2", "quote", @@ -95,6 +97,22 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "744a4c881f502e98c2241d2e5f50040ac73b30194d64452bb6260393b53f0dc9" +[[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 = "picoserve" version = "0.16.0" @@ -229,6 +247,12 @@ dependencies = [ "syn", ] +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + [[package]] name = "unicode-ident" version = "1.0.18" diff --git a/Cargo.toml b/Cargo.toml index 98afb55..4abb928 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,8 @@ default = [] picoserve = ["dep:picoserve"] [dependencies] +mime = { version = "0.3.17" } +mime_guess = "2.0.5" picoserve = {version = "0.16.0", optional = true } proc-macro2 = "1" quote = "1" diff --git a/examples/picoserve/Cargo.lock b/examples/picoserve/Cargo.lock index 5800f28..23abb36 100644 --- a/examples/picoserve/Cargo.lock +++ b/examples/picoserve/Cargo.lock @@ -78,6 +78,8 @@ checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" name = "dir-embed" version = "0.1.1" dependencies = [ + "mime", + "mime_guess", "picoserve 0.16.0", "proc-macro2", "quote", @@ -188,6 +190,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 = "miniz_oxide" version = "0.8.9" @@ -467,6 +485,12 @@ dependencies = [ "syn", ] +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + [[package]] name = "unicode-ident" version = "1.0.18" diff --git a/examples/picoserve/src/main.rs b/examples/picoserve/src/main.rs index 162976d..6026363 100644 --- a/examples/picoserve/src/main.rs +++ b/examples/picoserve/src/main.rs @@ -4,8 +4,10 @@ use picoserve::routing::get; #[derive(Embed)] #[dir = "../static"] +#[mode = "mime"] struct StaticStuff; + #[tokio::main] async fn main() { let port = 8000; diff --git a/src/lib.rs b/src/lib.rs index a415930..b8a8447 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +use mime::{Mime}; use proc_macro::TokenStream; use quote::quote; use syn::spanned::Spanned; @@ -10,6 +11,7 @@ use std::path::{Path, PathBuf}; enum EmbedMode { Bytes, Str, + BytesMime, } #[proc_macro_derive(Embed, attributes(dir, mode))] @@ -44,6 +46,7 @@ pub fn embed(input: proc_macro::TokenStream) -> proc_macro::TokenStream { for entry in collect_files(&absolue_path) { let rel_path = entry + .0 .strip_prefix(&absolue_path) .unwrap() .to_str() @@ -56,6 +59,11 @@ pub fn embed(input: proc_macro::TokenStream) -> proc_macro::TokenStream { let arm = match mode { EmbedMode::Bytes => generate_byte_arm(&rel_path, include_string), EmbedMode::Str => generate_str_arm(&rel_path, include_string), + EmbedMode::BytesMime => generate_mime_arm( + &rel_path, + include_string, + entry.1.unwrap_or(mime::APPLICATION_OCTET_STREAM), + ), }; match_arms.push(arm); @@ -65,26 +73,33 @@ pub fn embed(input: proc_macro::TokenStream) -> proc_macro::TokenStream { let mut expanded = match mode { EmbedMode::Bytes => generate_byte_impl(struct_name, match_arms), EmbedMode::Str => generate_str_impl(struct_name, match_arms), + EmbedMode::BytesMime => generate_mime_impl(struct_name, match_arms), }; #[cfg(feature = "picoserve")] { - expanded.extend(generate_picoserv_impl(struct_name)); + if matches!(mode,EmbedMode::BytesMime) { + expanded.extend(generate_picoserv_impl(struct_name)); + } } proc_macro::TokenStream::from(expanded) } -fn collect_files(dir: &Path) -> Vec { +fn collect_files(dir: &Path) -> Vec<(PathBuf, Option)> { let mut files = Vec::new(); + for entry in fs::read_dir(dir).unwrap() { let path = entry.unwrap().path(); + if path.is_file() { - files.push(path); + let mime_type = mime_guess::from_path(&path); + files.push((path, mime_type.first())); } else if path.is_dir() { files.extend(collect_files(&path)); } } + files } @@ -108,21 +123,22 @@ fn extract_dir_path(attr: &Attribute) -> String { fn extract_mode(attr: &Attribute) -> EmbedMode { let meta = match &attr.meta { Meta::NameValue(meta) => meta, - _ => panic!("Expected #[mode = \"bytes\"|\"str\"] as a name-value attribute."), + _ => panic!("Expected #[mode = \"bytes\"|\"str\"|\"mime\"] as a name-value attribute."), }; let expr_lit = match &meta.value { Expr::Lit(expr_lit) => expr_lit, - _ => panic!("Expected #[mode = \"bytes\"|\"str\"] with a string literal."), + _ => panic!("Expected #[mode = \"bytes\"|\"str\"|\"mime\"] with a string literal."), }; match &expr_lit.lit { Lit::Str(str) => match str.value().as_str() { "bytes" => EmbedMode::Bytes, "str" => EmbedMode::Str, - other => panic!("Unknown mode: {other}. Use `bytes` or `str`."), + "mime" => EmbedMode::BytesMime, + other => panic!("Unknown mode: {other}. Use `bytes`,`str` or `mime`."), }, - _ => panic!("Expected #[mode = \"bytes\"|\"str\"] to be a string."), + _ => panic!("Expected #[mode = \"bytes\"|\"str\"|\"mime\"] to be a string."), } } @@ -170,6 +186,29 @@ fn generate_str_impl( } } +fn generate_mime_arm(rel: &str, include: &str, mime_type: Mime) -> proc_macro2::TokenStream { + let mime_str = mime_type.essence_str(); + quote! { + #rel => Some((include_bytes!(#include),#mime_str)), + } +} + +fn generate_mime_impl( + struct_name: &Ident, + match_arms: Vec, +) -> proc_macro2::TokenStream { + quote! { + impl #struct_name { + pub fn get(name: &str) -> Option<(&'static [u8],&'static str)> { + match name { + #(#match_arms)* + _ => None, + } + } + } + } +} + #[cfg(feature = "picoserve")] fn generate_picoserv_impl(struct_name: &Ident) -> proc_macro2::TokenStream { quote! { @@ -198,7 +237,7 @@ fn generate_picoserv_impl(struct_name: &Ident) -> proc_macro2::TokenStream { match requested_file { Some(content) => { let response = - picoserve::response::Response::new(picoserve::response::StatusCode::OK, content); + picoserve::response::Response::new(picoserve::response::StatusCode::OK, content.0); response_writer diff --git a/testdata/bytes/bin b/testdata/bytes/bin new file mode 100644 index 0000000..7d174b1 --- /dev/null +++ b/testdata/bytes/bin @@ -0,0 +1 @@ +Þ­¾ï \ No newline at end of file diff --git a/testdata/file1.txt b/testdata/bytes/file1.txt similarity index 100% rename from testdata/file1.txt rename to testdata/bytes/file1.txt diff --git a/testdata/bytes/index.html b/testdata/bytes/index.html new file mode 100644 index 0000000..00e253b --- /dev/null +++ b/testdata/bytes/index.html @@ -0,0 +1,12 @@ + + + +Page Title + + + +

This is a Heading

+

This is a paragraph.

+ + + diff --git a/testdata/sub/file2.txt b/testdata/bytes/sub/file2.txt similarity index 100% rename from testdata/sub/file2.txt rename to testdata/bytes/sub/file2.txt diff --git a/testdata/str/file1.txt b/testdata/str/file1.txt new file mode 100644 index 0000000..08219db --- /dev/null +++ b/testdata/str/file1.txt @@ -0,0 +1 @@ +file1 \ No newline at end of file diff --git a/testdata/str/sub/file2.txt b/testdata/str/sub/file2.txt new file mode 100644 index 0000000..30d67d4 --- /dev/null +++ b/testdata/str/sub/file2.txt @@ -0,0 +1 @@ +file2 \ No newline at end of file diff --git a/tests/byte.rs b/tests/byte.rs index 2aadf85..e822519 100644 --- a/tests/byte.rs +++ b/tests/byte.rs @@ -1,7 +1,7 @@ use dir_embed::Embed; #[derive(Embed)] -#[dir = "./../testdata/"] +#[dir = "./../testdata/bytes/"] #[mode = "bytes"] pub struct Assets; @@ -41,3 +41,9 @@ fn byte_sub_directories_content() { let content_is = Assets::get("sub/file2.txt").unwrap(); assert_eq!(*content_is, *content_should); } + +#[test] +fn byte_read_bin() { + let file = Assets::get("bin").unwrap(); + assert_eq!(file, [0xDE, 0xAD, 0xBE, 0xEF]); +} diff --git a/tests/mime.rs b/tests/mime.rs new file mode 100644 index 0000000..d292951 --- /dev/null +++ b/tests/mime.rs @@ -0,0 +1,61 @@ +use dir_embed::Embed; + +#[derive(Embed)] +#[dir = "./../testdata/bytes/"] +#[mode = "mime"] +pub struct Assets; + +#[test] +fn mime_get() { + assert!(Assets::get("file1.txt").is_some()); +} + +#[test] +fn mime_get_missing() { + assert!(Assets::get("missing.txt").is_none()); +} + +#[test] +fn mime_read_content() { + let content_should = "file1".as_bytes(); + let content_is = Assets::get("file1.txt").unwrap(); + assert_eq!(*content_is.0, *content_should); +} + +#[test] +fn mime_parse_string() { + let file: &[u8] = Assets::get("file1.txt").expect("Can't find file").0; + let string = str::from_utf8(file).expect("Failed to parse file"); + + assert_eq!(string, "file1"); +} + +#[test] +fn mime_sub_directories_get() { + assert!(Assets::get("sub/file2.txt").is_some()); +} + +#[test] +fn mime_sub_directories_content() { + let content_should = "file2".as_bytes(); + let content_is = Assets::get("sub/file2.txt").unwrap(); + assert_eq!(*content_is.0, *content_should); +} + +#[test] +fn mime_type_html() { + let file = Assets::get("index.html").unwrap(); + assert_eq!(file.1, "text/html"); +} + +#[test] +fn mime_type_plain() { + let file = Assets::get("file1.txt").unwrap(); + assert_eq!(file.1, "text/plain"); +} + +#[test] +fn mime_default_type() { + let file = Assets::get("bin").unwrap(); + assert_eq!(file.1, "application/octet-stream"); +} diff --git a/tests/str.rs b/tests/str.rs index e81a2e0..5217b68 100644 --- a/tests/str.rs +++ b/tests/str.rs @@ -1,7 +1,7 @@ use dir_embed::Embed; #[derive(Embed)] -#[dir = "./../testdata/"] +#[dir = "./../testdata/str/"] #[mode = "str"] pub struct Assets; From 743a6d300a31a625237fc591a5fdc8a9207f67ac Mon Sep 17 00:00:00 2001 From: Niklas Kapelle Date: Wed, 30 Jul 2025 15:21:20 +0200 Subject: [PATCH 4/5] removed picoserve feature it is outside of the scope of this crate --- Cargo.lock | 189 --------- Cargo.toml | 2 - examples/picoserve/.gitignore | 1 - examples/picoserve/Cargo.lock | 577 --------------------------- examples/picoserve/Cargo.toml | 15 - examples/picoserve/src/main.rs | 57 --- examples/picoserve/static/index.html | 14 - examples/picoserve/static/script.js | 3 - examples/picoserve/static/style.css | 27 -- src/lib.rs | 54 +-- 10 files changed, 1 insertion(+), 938 deletions(-) delete mode 100644 examples/picoserve/.gitignore delete mode 100644 examples/picoserve/Cargo.lock delete mode 100644 examples/picoserve/Cargo.toml delete mode 100644 examples/picoserve/src/main.rs delete mode 100644 examples/picoserve/static/index.html delete mode 100644 examples/picoserve/static/script.js delete mode 100644 examples/picoserve/static/style.css diff --git a/Cargo.lock b/Cargo.lock index 2b98cab..24a1271 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,101 +2,17 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "const-sha1" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8a42181e0652c2997ae4d217f25b63c5337a52fd2279736e97b832fa0a3cff" - -[[package]] -name = "data-encoding" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" - [[package]] name = "dir-embed" version = "0.1.1" dependencies = [ "mime", "mime_guess", - "picoserve", "proc-macro2", "quote", "syn", ] -[[package]] -name = "embedded-io" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" - -[[package]] -name = "embedded-io-async" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff09972d4073aa8c299395be75161d582e7629cd663171d62af73c8d50dba3f" -dependencies = [ - "embedded-io", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-core", - "futures-task", - "pin-project-lite", - "pin-utils", -] - -[[package]] -name = "hash32" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" -dependencies = [ - "byteorder", -] - -[[package]] -name = "heapless" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" -dependencies = [ - "hash32", - "serde", - "stable_deref_trait", -] - -[[package]] -name = "lhash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "744a4c881f502e98c2241d2e5f50040ac73b30194d64452bb6260393b53f0dc9" - [[package]] name = "mime" version = "0.3.17" @@ -113,48 +29,6 @@ dependencies = [ "unicase", ] -[[package]] -name = "picoserve" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c13ee221d37df77538b033b831099235067c6a3fdcd2b80ef46c3d5b96e3b2" -dependencies = [ - "const-sha1", - "data-encoding", - "embedded-io-async", - "futures-util", - "heapless", - "lhash", - "picoserve_derive", - "ryu", - "serde", - "serde-json-core", - "thiserror", -] - -[[package]] -name = "picoserve_derive" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82a7350bdbef1ef80e4f058b89ca974dcc6526b04ac4d2095763b69760abf7ea" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - [[package]] name = "proc-macro2" version = "1.0.95" @@ -173,49 +47,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] -name = "serde" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde-json-core" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b81787e655bd59cecadc91f7b6b8651330b2be6c33246039a65e5cd6f4e0828" -dependencies = [ - "heapless", - "ryu", - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - [[package]] name = "syn" version = "2.0.104" @@ -227,26 +58,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "thiserror" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "unicase" version = "2.8.1" diff --git a/Cargo.toml b/Cargo.toml index 4abb928..1d07025 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,12 +13,10 @@ proc-macro = true [features] default = [] -picoserve = ["dep:picoserve"] [dependencies] mime = { version = "0.3.17" } mime_guess = "2.0.5" -picoserve = {version = "0.16.0", optional = true } proc-macro2 = "1" quote = "1" syn = { version = "2", features = ["full"] } diff --git a/examples/picoserve/.gitignore b/examples/picoserve/.gitignore deleted file mode 100644 index ea8c4bf..0000000 --- a/examples/picoserve/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target diff --git a/examples/picoserve/Cargo.lock b/examples/picoserve/Cargo.lock deleted file mode 100644 index 23abb36..0000000 --- a/examples/picoserve/Cargo.lock +++ /dev/null @@ -1,577 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - -[[package]] -name = "autocfg" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - -[[package]] -name = "backtrace" -version = "0.3.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets", -] - -[[package]] -name = "bitflags" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" - -[[package]] -name = "cfg-if" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" - -[[package]] -name = "const-sha1" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8a42181e0652c2997ae4d217f25b63c5337a52fd2279736e97b832fa0a3cff" - -[[package]] -name = "data-encoding" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" - -[[package]] -name = "dir-embed" -version = "0.1.1" -dependencies = [ - "mime", - "mime_guess", - "picoserve 0.16.0", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "embedded-io" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" - -[[package]] -name = "embedded-io-async" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff09972d4073aa8c299395be75161d582e7629cd663171d62af73c8d50dba3f" -dependencies = [ - "embedded-io", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-core", - "futures-task", - "pin-project-lite", - "pin-utils", -] - -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - -[[package]] -name = "hash32" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" -dependencies = [ - "byteorder", -] - -[[package]] -name = "heapless" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" -dependencies = [ - "hash32", - "serde", - "stable_deref_trait", -] - -[[package]] -name = "io-uring" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" -dependencies = [ - "bitflags", - "cfg-if", - "libc", -] - -[[package]] -name = "lhash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "744a4c881f502e98c2241d2e5f50040ac73b30194d64452bb6260393b53f0dc9" - -[[package]] -name = "libc" -version = "0.2.174" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" - -[[package]] -name = "lock_api" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "memchr" -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 = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", -] - -[[package]] -name = "mio" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" -dependencies = [ - "libc", - "wasi", - "windows-sys", -] - -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - -[[package]] -name = "parking_lot" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets", -] - -[[package]] -name = "picoserve" -version = "0.1.0" -dependencies = [ - "dir-embed", - "picoserve 0.16.0", - "tokio", -] - -[[package]] -name = "picoserve" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c13ee221d37df77538b033b831099235067c6a3fdcd2b80ef46c3d5b96e3b2" -dependencies = [ - "const-sha1", - "data-encoding", - "embedded-io-async", - "futures-util", - "heapless", - "lhash", - "picoserve_derive", - "ryu", - "serde", - "serde-json-core", - "thiserror", - "tokio", -] - -[[package]] -name = "picoserve_derive" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82a7350bdbef1ef80e4f058b89ca974dcc6526b04ac4d2095763b69760abf7ea" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "proc-macro2" -version = "1.0.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" -dependencies = [ - "bitflags", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" - -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "serde" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde-json-core" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b81787e655bd59cecadc91f7b6b8651330b2be6c33246039a65e5cd6f4e0828" -dependencies = [ - "heapless", - "ryu", - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" -dependencies = [ - "libc", -] - -[[package]] -name = "slab" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" - -[[package]] -name = "socket2" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" -dependencies = [ - "libc", - "windows-sys", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "syn" -version = "2.0.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "thiserror" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tokio" -version = "1.47.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35" -dependencies = [ - "backtrace", - "bytes", - "io-uring", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "slab", - "socket2", - "tokio-macros", - "windows-sys", -] - -[[package]] -name = "tokio-macros" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "unicase" -version = "2.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" - -[[package]] -name = "unicode-ident" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/examples/picoserve/Cargo.toml b/examples/picoserve/Cargo.toml deleted file mode 100644 index 9f15124..0000000 --- a/examples/picoserve/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "picoserve" -version = "0.1.0" -edition = "2024" - -[dependencies] -dir-embed = { path = "../../", features = ["picoserve"] } -picoserve = {version = "0.16.0", features = ["tokio"] } -tokio = { version = "1", features = ["full"] } - -[[bin]] -name = "picoserve" -path = "src/main.rs" - - diff --git a/examples/picoserve/src/main.rs b/examples/picoserve/src/main.rs deleted file mode 100644 index 6026363..0000000 --- a/examples/picoserve/src/main.rs +++ /dev/null @@ -1,57 +0,0 @@ -use std::time::Duration; -use dir_embed::Embed; -use picoserve::routing::get; - -#[derive(Embed)] -#[dir = "../static"] -#[mode = "mime"] -struct StaticStuff; - - -#[tokio::main] -async fn main() { - let port = 8000; - - let app = std::rc::Rc::new( - picoserve::Router::new() - .route("/api/hello", get(|| async { "Hello World" })) - .nest_service("/", StaticStuff) - .nest_service("/static", StaticStuff), - ); - - let config = picoserve::Config::new(picoserve::Timeouts { - start_read_request: Some(Duration::from_secs(5)), - persistent_start_read_request: Some(Duration::from_secs(1)), - read_request: Some(Duration::from_secs(1)), - write: Some(Duration::from_secs(1)), - }) - .keep_connection_alive(); - - let socket = tokio::net::TcpListener::bind((std::net::Ipv4Addr::LOCALHOST, port)) - .await - .unwrap(); - - tokio::task::LocalSet::new() - .run_until(async { - loop { - let (stream, remote_address) = socket.accept().await.unwrap(); - - println!("Connection from {remote_address}"); - - let app = app.clone(); - let config = config.clone(); - - tokio::task::spawn_local(async move { - match picoserve::serve(&app, &config, &mut [0; 2048], stream).await { - Ok(handled_requests_count) => { - println!( - "{handled_requests_count} requests handled from {remote_address}" - ) - } - Err(err) => println!("{err:?}"), - } - }); - } - }) - .await -} diff --git a/examples/picoserve/static/index.html b/examples/picoserve/static/index.html deleted file mode 100644 index f14597b..0000000 --- a/examples/picoserve/static/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - Simple Static Example - - - -

Hello from Static!

- -

- - - diff --git a/examples/picoserve/static/script.js b/examples/picoserve/static/script.js deleted file mode 100644 index ce5798f..0000000 --- a/examples/picoserve/static/script.js +++ /dev/null @@ -1,3 +0,0 @@ -document.getElementById("clickMeBtn").addEventListener("click", function() { - document.getElementById("message").textContent = "You clicked the button!"; -}); diff --git a/examples/picoserve/static/style.css b/examples/picoserve/static/style.css deleted file mode 100644 index e9aa661..0000000 --- a/examples/picoserve/static/style.css +++ /dev/null @@ -1,27 +0,0 @@ -body { - font-family: Arial, sans-serif; - background: #f7f8fa; - text-align: center; - margin-top: 100px; -} - -h1 { - color: #333; -} - -button { - padding: 10px 25px; - font-size: 16px; - cursor: pointer; - border-radius: 5px; - border: none; - background: #4e8cff; - color: white; - margin-top: 20px; -} - -#message { - margin-top: 30px; - color: #4e8cff; - font-weight: bold; -} diff --git a/src/lib.rs b/src/lib.rs index b8a8447..ebcd7fe 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,4 @@ -use mime::{Mime}; +use mime::Mime; use proc_macro::TokenStream; use quote::quote; use syn::spanned::Spanned; @@ -76,13 +76,6 @@ pub fn embed(input: proc_macro::TokenStream) -> proc_macro::TokenStream { EmbedMode::BytesMime => generate_mime_impl(struct_name, match_arms), }; - #[cfg(feature = "picoserve")] - { - if matches!(mode,EmbedMode::BytesMime) { - expanded.extend(generate_picoserv_impl(struct_name)); - } - } - proc_macro::TokenStream::from(expanded) } @@ -208,48 +201,3 @@ fn generate_mime_impl( } } } - -#[cfg(feature = "picoserve")] -fn generate_picoserv_impl(struct_name: &Ident) -> proc_macro2::TokenStream { - quote! { - impl picoserve::routing::PathRouterService for #struct_name { - async fn call_request_handler_service< - R: picoserve::io::embedded_io_async::Read, - W: picoserve::response::ResponseWriter, - >( - &self, - state: &State, - current_path_parameters: CurrentPathParameters, - path: picoserve::request::Path<'_>, - request: picoserve::request::Request<'_, R>, - response_writer: W, - ) -> Result { - let requested_path = path.encoded(); - - let requested_file = if requested_path.is_empty() { - 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, content.0); - - - 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 - } - } - } - } - } -} From a6ba8928db8ae7c48b8d1078778d9a42ceb37d2d Mon Sep 17 00:00:00 2001 From: Niklas Kapelle Date: Wed, 30 Jul 2025 15:28:54 +0200 Subject: [PATCH 5/5] updated readme --- README.md | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6f81462..c86ea4a 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,12 @@ Simple way to use [`include_bytes!`](https://doc.rust-lang.org/std/macro.include_bytes.html) for directories. +# Why + +I wanted to include a directory for my microcontroller project, but none of the solutions I used before seems to work in a no_std environment. + # Example -You can embed files two ways. +You can embed files three ways. ## Bytes mode @@ -39,3 +43,25 @@ fn main(){ println!("{file}"); } ``` + +## Mime mode +Same as "Bytes mode" but also add the guessed mime type from [`mime_guess`](https://crates.io/crates/mime_guess). +Defaults to `application/octet-stream` for unknown types. + +```rust +use dir_embed::Embed; + +#[derive(Embed)] +#[dir = "../web/static"] // Path is relativ to the current file +#[mode = "mime"] +pub struct Assets; + +fn main(){ + let file: (&[u8],&str) = Assets::get("css/style.css").expect("Can't find file"); + + let string = str::from_utf8(file.0).expect("Failed to parse file"); + + println!("{string}"); + println!("MIME: {file.1}"); // text/css +} +```