1use proc_macro::TokenStream;
2use quote::quote;
3use syn::{ItemStruct, parse_macro_input};
4
5#[proc_macro_derive(FromReqExtension)]
6pub fn from_req(input: TokenStream) -> TokenStream {
7 let input = parse_macro_input!(input as ItemStruct);
8
9 let mut input_generics = input.clone();
10 input_generics
11 .generics
12 .params
13 .push(syn::parse_quote! { FromRequestGeneric: std::marker::Sync });
14 let (impl_generics, _, _) = input_generics.generics.split_for_impl();
15
16 let name = input.ident;
17 let (_, type_generics, where_clause) = input.generics.split_for_impl();
18
19 quote! {
20 impl #impl_generics centaurus::axum::extract::FromRequestParts<FromRequestGeneric> for #name #type_generics #where_clause {
21 type Rejection = std::convert::Infallible;
22
23 async fn from_request_parts(
24 parts: &mut centaurus::http::request::Parts,
25 _state: &FromRequestGeneric,
26 ) -> std::result::Result<Self, Self::Rejection> {
27 use centaurus::axum::RequestPartsExt;
28
29 Ok(
30 parts
31 .extract::<centaurus::axum::Extension<Self>>()
32 .await
33 .expect(
34 format!(
35 "Should not fail. Did you add Extension({}) to your app?",
36 std::any::type_name::<Self>()
37 )
38 .as_str(),
39 )
40 .0,
41 )
42 }
43 }
44 }
45 .into()
46}