added picoserve feature

The derived struct can now server as a PathRouter from picoserve
This commit is contained in:
2025-07-29 15:57:42 +02:00
parent 7b110a43b4
commit 44e2abfeaf
3 changed files with 246 additions and 1 deletions

View File

@@ -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<State, CurrentPathParameters> picoserve::routing::PathRouterService<State, CurrentPathParameters> for #struct_name {
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.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
}
}
}
}
}
}