spin_wasip3_http_macro/
lib.rs1use proc_macro::TokenStream;
2use quote::quote;
3
4#[proc_macro_attribute]
5pub fn http_service(_attr: TokenStream, item: TokenStream) -> TokenStream {
6 let func = syn::parse_macro_input!(item as syn::ItemFn);
7
8 if func.sig.asyncness.is_none() {
9 return syn::Error::new_spanned(
10 func.sig.fn_token,
11 "the `#[http_service]` function must be `async`",
12 )
13 .to_compile_error()
14 .into();
15 }
16
17 let func_name = &func.sig.ident;
18
19 quote!(
20 #func
21 mod __spin_wasip3_http {
22 use ::spin_sdk::http_wasip3::IntoResponse;
23
24 struct Spin;
25 ::spin_sdk::http_wasip3::wasip3::http::proxy::export!(Spin);
26
27 impl ::spin_sdk::http_wasip3::wasip3::exports::http::handler::Guest for self::Spin {
28 async fn handle(request: ::spin_sdk::http_wasip3::wasip3::http::types::Request) -> Result<::spin_sdk::http_wasip3::wasip3::http::types::Response, ::spin_sdk::http_wasip3::wasip3::http::types::ErrorCode> {
29 let request = <::spin_sdk::http_wasip3::Request as ::spin_sdk::http_wasip3::FromRequest>::from_request(request)?;
30 ::spin_sdk::http_wasip3::IntoResponse::into_response(super::#func_name(request).await)
31 }
32 }
33 }
34 )
35 .into()
36}