centaurus_derive/
lib.rs

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}