spin_wasip3_http_macro/
lib.rs

1use 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}